转自孙鑫老师的VC++系列第一课
#include <windows.h>
#include <stdio.h>
//窗口过程函数,即回调函数,该函数的代码由操作系统自动调用,CALLBACK表示__stdcall标准调用约定
LRESULT CALLBACK WinSunProc(
HWND hwnd, // 窗口句柄
UINT uMsg, // 消息识别符
WPARAM wParam, // 第一个消息参数
LPARAM lParam // 第二个消息参数
);
//WinMain函数由系统调用,里面的四个参数均由系统赋值
int WINAPI WinMain(
HINSTANCE hInstance, // 当前程序的实例句柄
HINSTANCE hPrevInstance, // 之前程序的实例句柄
LPSTR lpCmdLine, // Cmd运行的指令
int nCmdShow // 显示的状态,如最大最小
)
{
//开始设计窗口类
WNDCLASS wndcls;
wndcls.cbClsExtra=0;//类的额外内存,默认为0即可
wndcls.cbWndExtra=0;//窗口的额外内存,默认为0即可
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//获取画刷句柄(将返回的HGDIOBJ进行强制类型转换)
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);//设置光标
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);//设置窗体左上角的图标
wndcls.hInstance=hInstance;//设置窗体所属的应用程序实例
wndcls.lpfnWndProc=WinSunProc;//设置窗体的回调函数
wndcls.lpszClassName="Weixin2003";//设置窗体的类名
wndcls.lpszMenuName=NULL;//设置窗体的菜单
wndcls.style=CS_HREDRAW | CS_VREDRAW;//设置窗体风格为水平重画和垂直重画
RegisterClass(&wndcls);//向操作系统注册窗体
HWND hwnd;
//产生一个窗体,并返回该窗体的句柄,第一个参数必须为要创建的窗体的类名,第二个参数为窗体标题名
hwnd=CreateWindow("Weixin2003","北京维新科学技术培训中心",WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);//把窗体显示出来
UpdateWindow(hwnd);//更新窗体
MSG msg;
//消息循环
while(GetMessage(&msg,NULL,0,0))//如果消息不是WM_QUIT,返回非零值;如果消息是WM_QUIT,返回零
{
TranslateMessage(&msg);//翻译消息,如把WM_KEYDOWN和WM_KEYUP翻译成一个WM_CHAR消息
DispatchMessage(&msg);//派发消息
}
return 0;
}
LRESULT CALLBACK WinSunProc(
HWND hwnd, // 窗口句柄
UINT uMsg, // 消息识别符
WPARAM wParam, // 第一个消息参数
LPARAM lParam // 第二个消息参数
)
{
switch(uMsg)//通过判断消息进行消息响应
{
case WM_CHAR:
char szChar[20];
sprintf(szChar,"char is %d",wParam);
MessageBox(hwnd,szChar,"weixin",0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"mouse clicked","weixin",0);
HDC hdc;
hdc=GetDC(hwnd);//GetDC与ReleaseDC组合使用
TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训"));
ReleaseDC(hwnd,hdc);//要释放HDC,如果不释放会导致内存泄漏
break;
case WM_PAINT://响应重绘消息
/*当窗体的width和height改变的时候(比如用鼠标调整了窗体的大小)会触发重绘事件,
但是通过标题栏移动窗体不会触发重绘事件,窗体第一次显示的时候也会触发重绘事件。
BeginPaint和EndPaint必须组合使用,并且只能出现在响应重绘消息的地方*/
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,"维新培训",strlen("维新培训"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
{
DestroyWindow(hwnd);//销毁窗口并发送WM_DESTROY消息,但是程序没有退出
}
break;
case WM_DESTROY:
PostQuitMessage(0);//发出WM_QUIT消息,结束消息循环
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);//对不感兴趣的消息进行缺省处理,必须有该代码,否则程序有问题
}
return 0;
}