改写自候捷的generic.c
//---------------------------------------------------------------------
// 文件 : generic.c
// 作者 : gencheng
// 编译连接 : 请参考 generic.mak
//---------------------------------------------------------------------
#include <windows.h> // 每一个Windows程序都需要载入此头文件
#include "resource.h" // 内含各个 resource IDs
HINSTANCE _hInst; // Instance handle
HWND _hWnd;
char _szAppName[] = "Generic";
char _szTitle[] = "Base Win32 SDK Application";
//---------------------------------------------------------------------
// About - 对话框函数
//---------------------------------------------------------------------
LRESULT CALLBACK About(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message) {
case WM_INITDIALOG:
return (TRUE);
case WM_COMMAND:
if (LOWORD(wParam) == IDOK
|| LOWORD(wParam) == IDCANCEL) {
EndDialog(hDlg, TRUE);
return (TRUE);
}
break;
}
return (FALSE);
}
//---------------------------------------------------------------------
// WndProc - 窗口函数
//---------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
switch (message) {
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId) {
case IDM_ABOUT:
DialogBox(_hInst,
"AboutBox",
hWnd,
(DLGPROC)About
);
break;
case IDM_EXIT:
DestroyWindow (hWnd);
break;
default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
break;
case WM_LBUTTONDOWN:
MessageBox(hWnd, "鼠标左键单击!", "消息", MB_ICONINFORMATION);
break;
case WM_RBUTTONDOWN:
MessageBox(hWnd, "鼠标右键单击!", "消息", MB_ICONINFORMATION);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
return (0);
}
//---------------------------------------------------------------------
// WinMain - 程序进入点
//---------------------------------------------------------------------
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASS wc;
UNREFERENCED_PARAMETER(lpCmdLine); // 避免编译时的警告
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, "jjhouricon");
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = GetStockObject(WHITE_BRUSH); // 窗口后台颜色
wc.lpszMenuName = "GenericMenu"; // .RC 所定义的窗体
wc.lpszClassName = _szAppName;
RegisterClass(&wc);
_hInst = hInstance; // 存储为全局变量,方便使用
_hWnd = CreateWindow( //CreateWindow()
_szAppName,
_szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
if (!_hWnd)
return (FALSE);
ShowWindow(_hWnd, nCmdShow);
UpdateWindow(_hWnd);
/*--以下是主消息循环--*/
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
//------------------------ end of file ------------------------------
个人感觉,我修改的这个源程序,比候捷的哪个更简洁,基本是用Win32 SDK 堆砌构建而成。
总结一下,创建一个窗口,必须需要用到以下Win32 API:
RegisterClass 为程序窗口注册窗口类别。
CreateWindow 根据窗口类别建立一个窗口。
ShowWindow 在屏幕上显示窗口。
UpdateWindow 指示窗口自我更新。
GetMessage 从消息队列中取得消息。
TranslateMessage 转译某些键盘消息。
DispatchMessage 将消息发送给窗口消息处理程序。
PostQuitMessage 在消息队列中插入一个「退出程序」消息。
DefWindowProc 执行内定的消息处理。
这些函数均在MSDN文件中有说明,VC中在不同的表头文件中声明,其中绝大多数声明在WINUSER.H中。