本系列(VC++深入详解)为《VC++深入详解》(孙鑫 编著)读书笔记,很多例子都是仿照此书,很多概念也是来自此书,在对其做归纳总结的同时,也加入了自己的一些理解。
一、 最简单的Windows程序框架概览
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WndProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
int WINAPI WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
)
{
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wnd.hCursor = LoadCursor(NULL, IDC_HAND);
wnd.hIcon = LoadIcon(NULL, IDI_INFORMATION);
wnd.hInstance = hInstance;
wnd.lpfnWndProc = WndProc;
wnd.lpszClassName = "uranux";
wnd.lpszMenuName = NULL;
wnd.style = CS_VREDRAW | CS_HREDRAW;
RegisterClass(&wnd);
HWND hWnd = CreateWindow(wnd.lpszClassName, "Hello Uranux!", WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, 100, 100, 500, 400, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, SW_SHOWNORMAL);
UpdateWindow(hWnd);
MSG msg;
BOOL bRet;
while (bRet = GetMessage(&msg, hWnd, 0, 0))
{
if (bRet == -1)
{
DWORD dwErr = GetLastError();
char info[10];
sprintf_s(info, "%d", dwErr);
MessageBox(hWnd, info, "Error", 0);
return -1;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
LRESULT CALLBACK WndProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{
HDC hDC;
PAINTSTRUCT ps;
static int charCount = 0;
int x, y;
switch (uMsg)
{
case WM_CHAR:
hDC = GetDC(hwnd);
TextOut(hDC, 100 + charCount * 8, 100, (LPCSTR)&wParam, 1);
charCount++;
ReleaseDC(hwnd, hDC);
break;
case WM_LBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
hDC = GetDC(hwnd);
char info[100];
char keyType[10];
switch (wParam)
{
case MK_LBUTTON:
strcpy_s(keyType, "Left");
break;
case MK_MBUTTON:
strcpy_s(keyType, "Middle");
break;
case MK_RBUTTON:
strcpy_s(keyType, "Right");
break;
default:
break;
}
x = lParam & 0x0000FFFF;
y = lParam >> 16;
sprintf_s(info, "%s Key down, At (%d, %d)", keyType, x, y);
TextOut(hDC, 200, 0, info, strlen(info));
ReleaseDC(hwnd, hDC);
break;
case WM_PAINT:
hDC = BeginPaint(hwnd, &ps);
TextOut(hDC, 0, 0, "Hi, I'm