VC++深入学习1

来源:互联网 发布:vb语言基础 编辑:程序博客网 时间:2024/05/29 17:02

windows下利用VC6的应用程序编写,

再利用MSDN,写出一个窗口。


首先明确一个过程  : 

1.用户发出需求(例如按下键盘某个键)

2.操作系统感知到I/O设备,将用户需求包装成一个消息,投递(post,记单词,很有用)到消息队列中

3.应用程序从自己的消息队列中取走消息,并对它作出响应(既然是队列,肯定满足FIFO)

4.程序响应后,通知操作系统,操作系统根据程序的的命令来控制I/O设备


注意几个点:

1.每个windows程序开始后,系统会为这个程序创建消息队列

2.消息是用MSG结构体来表示,定义参见MSDN

3.程序的入口时WinMain函数,一个程序一开始执行,操作系统调用的就是该程序的WinMain函数。

4.作为程序员,不需要了解操作系统是如何与硬件打交道的(//可是我是学电子的,我还是得知道T.T)

我们只要在程序中调用windows系统提供的API,就可完成windows应用程序的编写,当然不同系统有不同的API,就像不同单片机对应不同的汇编语言一样

5.有时候这些API就和芯片中的端口寄存器一样,只要对它某一位赋值就可以让它做出不同功能,微命令由操作系统自己完成。(例如设计窗口类的style变量)



下面给出一个例子,自己编写winmain函数,创建一个最简单的窗口,

步骤

1.定义winmain函数

2.创建窗口

3.消息循环

4.编写窗口过程函数




#include<windows.h>#include<stdio.h>LRESULT CALLBACK lymproc( HWND hwnd,      // handle to window UINT uMsg,      // message identifier WPARAM wParam,  // first message parameter LPARAM lParam   // second message parameter );int WINAPI WinMain(   HINSTANCE hInstance,      // handle to current instance   HINSTANCE hPrevInstance,  // handle to previous instance   LPSTR lpCmdLine,          // command line   int nCmdShow              // show state){WNDCLASS wndcls;wndcls.cbClsExtra=0;wndcls.cbWndExtra=0;wndcls.hbrBackground=(HBRUSH)GetStockObject(DKGRAY_BRUSH);wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);wndcls.hIcon=LoadIcon(NULL,IDI_INFORMATION);wndcls.hInstance=hInstance;wndcls.lpfnWndProc=lymproc;//wndcls.lpszClassName="LymWindows";wndcls.lpszMenuName=NULL;wndcls.style=CS_HREDRAW|CS_VREDRAW;RegisterClass(&wndcls);HWND hwnd;hwnd=CreateWindow("LymWindows","Hello",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,600,400,NULL,NULL,hInstance,NULL);ShowWindow(hwnd,SW_SHOWNORMAL);UpdateWindow(hwnd);//SendMessage(hwnd,WM_LBUTTONDOWN,0,0);//可以直接给窗口发送消息,不经过消息队列//PostMessage(hwnd,WM_LBUTTONDOWN,0,0);//post是投到消息队列中MSG msg;//消息循环while(GetMessage(&msg,NULL,0,0))//不断从消息队列取出消息,只有收到WM_QUIT消息才为0,PostQuitMessage(0)可以投递一个WM_QUIT消息{TranslateMessage(&msg);//将虚拟键消息转化为字符消息投入消息队列,与键盘输入相关DispatchMessage(&msg);//分派一个消息到窗口过程,系统调用窗口过程函数响应消息}return 0;}//编写窗口过程函数LRESULT CALLBACK lymproc(HWND hwnd,      // handle to windowUINT uMsg,      // message identifierWPARAM wParam,  // first message parameterLPARAM lParam   // second message parameter ){switch (uMsg){case WM_CHAR://WM_CHAR才能表示字符,如果是WM_KEYDOWN,那就无法区分功能键还是字符键了char s[20];sprintf(s,"char code is %d",wParam);MessageBox(hwnd,s,"hello ",MB_OK);break;case WM_PAINT:HDC h1;PAINTSTRUCT ps;h1=BeginPaint(hwnd,&ps);//只能在响应WM_PAINT消息时可以用beginpaintTextOut(h1,0,0,"林一鸣窗口程序1",strlen("林一鸣窗口程序1"));EndPaint(hwnd,&ps);ReleaseDC(hwnd,h1);break;case WM_LBUTTONDOWN:MessageBox(hwnd,"you have clicked left button!","NOTICE",MB_OK);break;case WM_CLOSE:DestroyWindow(hwnd);//销毁窗口,但是不退出程序PostQuitMessage(0);break;case WM_DESTROY://退出时,必须要响应destroy消息PostQuitMessage(0);break;default:return DefWindowProc(hwnd,uMsg,wParam,lParam);//对不进行特别响应的消息,则由系统默认的函数进行响应}return 0;}

原创粉丝点击