Вот, например, шаблон программы, создающей главное окно приложения, использующего двойную буферизацию для прорисовки клиентской области:
| Код | #include <tchar.h> #include <windows.h> #include <windowsx.h>
const TCHAR* CLASS_NAME = _T ("Win32API_template"); const TCHAR* PROGRAM_NAME = _T ("Win32 API (GDI) program template");
HWND h_wnd_main = NULL;
LRESULT CALLBACK wnd_fun (HWND h_wnd, UINT u_msg, WPARAM w_param, LPARAM l_param) { switch (u_msg) { case WM_PAINT: // Прорисовка с двойной буферизацией { PAINTSTRUCT ps; HDC h_dc = BeginPaint (h_wnd, &ps); HDC h_comp_dc = CreateCompatibleDC (h_dc);
HBITMAP h_back_buffer = CreateCompatibleBitmap (h_dc, ps.rcPaint.right, ps.rcPaint.bottom); HBITMAP h_old_bitmap = SelectBitmap (h_comp_dc, h_back_buffer);
HBRUSH h_solid_brush = CreateSolidBrush (GetSysColor (COLOR_WINDOW)); FillRect (h_comp_dc, &ps.rcPaint, h_solid_brush); DeleteObject (h_solid_brush);
// Здесь - код, рисующий в клиентской области на совместимом контексте устройства
BitBlt (h_dc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom, h_comp_dc, ps.rcPaint.left, ps.rcPaint.top, SRCCOPY); SelectBitmap (h_comp_dc, h_old_bitmap), DeleteObject (h_back_buffer);
DeleteDC (h_comp_dc); EndPaint (h_wnd, &ps); } return 0; case WM_GETMINMAXINFO: reinterpret_cast <PMINMAXINFO>(l_param)->ptMinTrackSize.x = GetSystemMetrics (SM_CXSCREEN) >> 1; reinterpret_cast <PMINMAXINFO>(l_param)->ptMinTrackSize.y = GetSystemMetrics (SM_CYSCREEN) >> 1; break; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (h_wnd, u_msg, w_param, l_param); }
int WINAPI _tWinMain (HINSTANCE h_instance, HINSTANCE, PTSTR, int cmd_show) { WNDCLASS wc = { CS_HREDRAW | CS_VREDRAW | CS_OWNDC, wnd_fun, 0, 0, h_instance, LoadIcon (NULL, IDI_APPLICATION), LoadCursor (NULL, IDC_ARROW), NULL, NULL, CLASS_NAME }; if (!RegisterClass (&wc) || !(h_wnd_main = CreateWindowEx (WS_EX_CLIENTEDGE, CLASS_NAME, PROGRAM_NAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, h_instance, NULL))) { MessageBox (NULL, _T ("Ошибка при создании главного окна; программа будет завершена"), PROGRAM_NAME, MB_OK | MB_ICONERROR); return 1; }
ShowWindow (h_wnd_main, cmd_show); UpdateWindow (h_wnd_main);
MSG msg; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); }
return 0; }
| Добавлено @ 16:30 А регистрация класса окна — это примерно то же, что создание класса в C++. Регистрируя класс окна, пользователь получает возможность создания множества однотипных окон, в т.ч. с одной и той же оконной функцией.
Аналогия — создание какого-либо элемента управления. Скажем, банальная кнопка имеет класс «button». |