三、第一个窗口程序
3.1、入口函数WinMain
3.2、窗口处理函数
当窗口处理消息事件时,系统调用该函数
LRESULT CALLBACK WindowProc(
HWND hwnd, //窗口的句柄
UINT uMsg,//消息的ID号
WPARAM wParam,//消息所对应的参数
LPARAM lParam);//消息所对应的参数
3.3、注册窗口类型
typedef struct _WNDCLASS{
UINT style; //窗口类的风格
WNDPROC lpfnWndProc; //窗口处理函数
int cbClsExtra; //窗口类附加数据大小
int cbWndExtra; //窗口附加数据大小
HANDLE hInstance; //当前应用程序的实例句柄
HICON hIcon; //窗口图标
HCURSOR hCursor; //窗口的鼠标
HBRUSH hbrBackground; //窗口的背景画刷
LPCTSTR lpszMenuName; //菜单
LPCTSTR lpszClassName; //类型名称
}WNDCLASS;
注册函数 RegisterClass
3.4、创建窗口
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); //创建的参数,一般为NULL
3.5、显示窗口
ShowWindow 显示窗口
BOOL ShowWindow(
HWND hWnd, //显示的窗口句柄
int nCmdShow);//显示的方式
UpdateWindow 刷新窗口
3.6、消息处理
GetMessage 获取消息
DispatchMessage 派发消息
3.7、程序退出
窗口销毁时,退出程序。在WndProc中实现。
WM_DESTROY:当窗口销毁时,会调用WndProc传递给使用者。
PostQuitMessage:发送一个退出消息。
四、资源的处理
4.1、资源和资源脚本
资源:ICON/CUSRUR/BITMAP/MENU.....
资源脚本:扩展名为rc文件。
4.2、编译资源
rc.exe编译资源,生成res文件
4.3、链接资源
使用link.exe将res文件链接到程序当中。
4.4、ICON的使用
LoadIcon从指定程序中加载ICON资源。
编写一个资源脚本
新建一个hellowindows.rc文件
里面写入:
100 ICON "114.ico"
然后编译: rc hellowindows.rc
cl hellowindows.c /c
link hellowindows.obj hellowindows.res user32.lib
执行hellowindows,这样可以改变程序外观的图标
如果改变对话框的图标:
必须在注册窗口函数里wc.hIcon=LoadIcon(g_hInst,MAKEINTRESOURCE(100));
#include <windows.h> HINSTANCE g_hInst = NULL; //2 窗口处理函数 LRESULT CALLBACK WndProc( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam ) { //判断消息ID switch( nMsg ) { case WM_DESTROY: //窗口销毁的消息 PostQuitMessage( 0 ); //发送退出消息 return 0; } //调用缺省的消息处理程序 return DefWindowProc( hWnd, nMsg, wParam, lParam ); } //3 注册窗口类型 BOOL MyRegister( LPSTR pszClassName ) { WNDCLASS wc = {0}; ATOM nAtom = 0; //构造注册窗口的参数 wc.style = CS_VREDRAW|CS_HREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = g_hInst; wc.hIcon = NULL; wc.hCursor = NULL; wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE); wc.lpszMenuName = NULL; wc.lpszClassName = pszClassName; //注册窗口 nAtom = RegisterClass( &wc ); if( 0 == nAtom ) { MessageBox( NULL, "Register Failed", "Error", MB_OK|MB_ICONWARNING ); return FALSE; } else { MessageBox( NULL, "Register Successed", "Successed", MB_OK ); } return TRUE; } //4 窗口创建 HWND MyCreate( LPSTR pszClassName ) { HWND hWnd = NULL; //创建窗口 hWnd = CreateWindow( pszClassName, "HelloWnd", WS_OVERLAPPEDWINDOW, 100, 100, 300, 500, NULL, NULL, g_hInst, NULL ); if( NULL == hWnd ) { MessageBox( NULL, "CreateWnd Failed", "Error", MB_OK ); return NULL; } MessageBox( NULL, "CreateWnd Successed", "Successed", MB_OK ); return hWnd; } //5 显示窗口 void DisplayWnd( HWND hWnd ) { //显示 ShowWindow( hWnd, SW_SHOW ); //刷新 UpdateWindow( hWnd ); } //6 消息处理 void Message( ) { MSG msg = { 0 }; //消息循环处理,获取消息 while( GetMessage( &msg, NULL, 0, 0 ) ) { //派发消息 DispatchMessage( &msg ); } } //1 入口函数 int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pszCmdLine, int nShowCmd ) { HWND hWnd = NULL; g_hInst = hInst; //注册窗口类型 MyRegister( "MyWnd" ); //创建注册类型的窗口 hWnd = MyCreate( "MyWnd" ); //显示窗口 DisplayWnd( hWnd ); //消息处理 Message( ); return 0; }