这里只是一个基本的编程框架,具体的说明请看其他博文的注释吧。
resource.h
//{{NO_DEPENDENCIES}} // Microsoft Visual C++ 生成的包含文件。 // 供 Work.rc 使用 // #ifndef RESOURCE_H_INCLUDE #define RESOURCE_H_INCLUDE /**** * Resource Define */ #define IDI_APP 100 #define IDI_APPSMALL 101 #define IDR_APP 102 #define IDS_APP_TITLE 1000 #define IDM_FILE_NEW 1101 #define IDM_FILE_OPEN 1102 #define IDM_EXIT 1103 #define IDM_ABOUT 1104 #endif
Work.rc
#include <windows.h> #include "resource.h" IDI_APP ICON DISCARDABLE "res\\app.ico" IDI_APPSMALL ICON DISCARDABLE "res\\appsmall.ico" IDR_APP MENU DISCARDABLE BEGIN POPUP "文件(&F)" BEGIN MENUITEM "新建(&N)\tCtrl+N", IDM_FILE_NEW MENUITEM "打开(&O)...\tCtrl+N", IDM_FILE_OPEN MENUITEM SEPARATOR MENUITEM "退出(&X)", IDM_EXIT END POPUP "帮助(&H)" BEGIN MENUITEM "软件简介(&A)...", IDM_ABOUT END END IDR_APP ACCELERATORS MOVEABLE PURE BEGIN "^N", IDM_FILE_NEW "O", IDM_FILE_OPEN, VIRTKEY,CONTROL "X", IDM_EXIT, VIRTKEY,ALT VK_F1, IDM_ABOUT, VIRTKEY END STRINGABLE DISCARDABLE BEGIN IDS_APP_TITLE "Happy Birthday" END
main.cpp
#include <windows.h> #include "resource.h" HINSTANCE hInst; HWND hMainWnd; CONST WCHAR szWindowTitle[]=L"Happy Birthday"; CONST WCHAR szWindowClass[]=L"SDKWIN32APP"; typedef LRESULT (*__pfn_t)(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); struct WIN_MSGMAP_ENTRY{ UINT nMessage; __pfn_t pfn; }; #define BEGIN_MESSAGE_MAP() CONST struct WIN_MSGMAP_ENTRY _messageEntries[]={ #define ON_MSG(nMessage,pfn) {nMessage,pfn}, #define END_MESSAGE_MAP() {0,NULL}}; BEGIN_MESSAGE_MAP() // ON_MSG() END_MESSAGE_MAP() LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam){ WORD i; for (i=0;_messageEntries[i].nMessage;i++){ if (message==_messageEntries[i].nMessage){ if (message!=WM_DESTROY){ return (*_messageEntries[i].pfn)(hWnd,message,wParam,lParam); } (*_messageEntries[i].pfn)(hWnd,message,wParam,lParam); break; } } if (message==WM_DESTROY){ PostQuitMessage(0); return 0; } return DefWindowProc(hWnd,message,wParam,lParam); } ATOM MyRegisterClass(HINSTANCE hInstance){ WNDCLASSEX wcex; wcex.cbSize =sizeof(WNDCLASSEX); wcex.style =CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; wcex.lpfnWndProc =(WNDPROC)WndProc; wcex.cbClsExtra =0; wcex.cbWndExtra =0; wcex.hInstance =hInstance; wcex.hIcon =LoadIcon(hInstance,(LPCTSTR)IDI_APP); wcex.hCursor =LoadCursor(NULL,IDC_ARROW); wcex.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); wcex.lpszMenuName =(LPCTSTR)IDR_APP; wcex.lpszClassName =szWindowClass; wcex.hIconSm =LoadIcon(hInstance,(LPCTSTR)IDI_APPSMALL); return RegisterClassEx(&wcex); } BOOL InitInstance(HINSTANCE hInstance,int nCmdShow){ DWORD ds=WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN; hInst=hInstance; hMainWnd=CreateWindow( szWindowClass,szWindowTitle,ds, CW_USEDEFAULT,0,CW_USEDEFAULT,0, NULL,NULL,hInstance,NULL ); if (!hMainWnd){ return FALSE; } ShowWindow(hMainWnd,nCmdShow); UpdateWindow(hMainWnd); return TRUE; } int Run(){ MSG msg; HACCEL hAccelTable; hAccelTable=LoadAccelerators(hInst,(LPCTSTR)IDR_APP); while (GetMessage(&msg,NULL,0,0)){ if (!TranslateAccelerator(msg.hwnd,hAccelTable,&msg)){ TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; } int APIENTRY WinMain(HINSTANCE hIstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){ MyRegisterClass(hIstance); if (!InitInstance(hIstance,nCmdShow)){ return 0; } return Run(); }
下面是生成的应用程序(.exe)和实际运行时的窗口