大致流程:
1. 写WinMain函数,即入口函数。
2. 创建一个窗口类,创建窗口,设置刷新等等。
3. 进行消息循环。
4. 编写窗口过程函数。
先看看WinMain函数:
int WINAPI WinMain(
HINSTANCE hInstance, // 当前实例句柄
HINSTANCE hPrevInstance, // 前一个实例句柄
LPSTR lpCmdLine, // 命令行参数
int nCmdShow // 如何显示
)
再看看怎么创建窗口:
说在前面:关于样式之类的请查看MSDN或者百度。
1. 设计窗口类:
typedef struct _WNDCLASS {
UINT style;// 窗口样式
WNDPROC lpfnWndProc;//函数指针,指向窗口处理函数
int cbClsExtra;//附加内存,一般为0
int cbWndExtra;//窗口附加内存,一般也为0
HINSTANCE hInstance;//实例句柄
HICON hIcon;//窗口的图标句柄
HCURSOR hCursor;//窗口鼠标光标
HBRUSH hbrBackground;//窗口背景色
LPCTSTR lpszMenuName;//窗口菜单名
LPCTSTR lpszClassName;// 窗口类名
} WNDCLASS, *LPWNDCLASS;
2.注册窗口类
RegisterClass(&窗口类);//注册窗口类
3.创建窗口
HWND CreateWindow(
LPCTSTR lpClassName,//类名
LPCTSTR lpWindowName,//窗口名
DWORD dwStyle,//样式
int x,//初始x坐标
int y,//初始y坐标
int nWidth,//窗口宽度
int nHeight,//窗口高度
HWND hWndParent,//父窗口句柄
HMENU hMenu,//菜单句柄
HANDLE hlnstance,//实例句柄
LPVOID lpParam//数据指针,指向CLIENTCREATESTRUCT结构体,一般指向NULL
);
4.显示和刷新窗口
ShowWindow(hwnd,SW_SHOWNORMAL);//激活并显示
UpdateWindow(hwnd);
进入消息循环:
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
也就是第一章说的那个卖冰淇淋的,不断接受消息,查看对应事件,并处理,处理的过程在窗口过程函数。
编写窗口处理函数:
其实就是个回调函数,当消息进来的时候,判断属于哪个消息,然后进行对应操作。
LRESULT CALLBACK WinSunProc(
HWND hwnd, //句柄
UINT uMsg, //消息
WPARAM wParam, //附加参数1
LPARAM lParam //附加参数2
)
{
switch(uMsg)
{
case WM_CHAR:
char szChar[200];
sprintf(szChar,"char is %d",wParam);
MessageBox(hwnd,szChar,"HappyTeemo",0);
break;
case XXX:
........
}
return 0;
}
下面是整体代码:所有是HappyTeemo的都是可以自由修改的
#include <Windows.h>
#include <stdio.h>
//声明窗口过程函数
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
//主函数
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
const char* ClassName = "HappyTeemo";
//设计窗口类
WNDCLASS wndcls;
wndcls.cbClsExtra = 0;
wndcls.cbWndExtra = 0;
wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wndcls.hCursor = LoadCursor(NULL,IDC_CROSS);
wndcls.hIcon = LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance = hInstance;
wndcls.lpfnWndProc = WinSunProc;
wndcls.lpszClassName = ClassName;
wndcls.lpszMenuName = NULL;
wndcls.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls);//注册窗口类
//创建窗口
HWND hwnd;
hwnd = CreateWindow(ClassName,"HappyTeemoFirstWindow",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);
//显示和刷新窗口
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
//定义消息结构体,开始消息循环
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//窗口过程函数
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
case WM_CHAR: //按下字符键
char szChar[200];
sprintf(szChar,"char is %d",wParam);
MessageBox(hwnd,szChar,"HappyTeemo",0);
break;
case WM_LBUTTONDOWN://鼠标左键
MessageBox(hwnd,"mouse clicked","HappyTeemo",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"HappyTeemo",strlen("HappyTeemo"));
ReleaseDC(hwnd,hdc);
break;
case WM_PAINT: //重绘
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,"HappyTeemo",strlen("HappyTeemo"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE://关闭
if(IDYES==MessageBox(hwnd,"Close?","HappyTeemo",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY://销毁
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}