|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Using Owner-Drawn Buttons
The parent window of an owner-drawn button typically responds to at least three messages for the button: WM_INITDIALOG, WM_COMMAND, and WM_DRAWITEM. It is not necessary to process the WM_MEASUREITEM message for owner-drawn buttons.
When you must paint an owner-drawn button, Windows sends the parent window a WM_DRAWITEM message whose lParam points to a DRAWITEMSTRUCT structure. Use this structure with all owner-drawn controls to provide the application with the information it requires to paint the control. The itemAction and itemState members of the DRAWITEMSTRUCT structure define how to paint an owner-drawn button. The following example shows how to process WM_INITDIALOG, WM_DRAWITEM, and WM_COMMAND messages for owner-drawn buttons. This example demonstrates how to draw one of two bitmaps for a control, depending on whether the control is selected. You would typically use the wParam parameter of the WM_DRAWITEM message to identify the control; in this example, only one control is assumed.
LRESULT APIENTRY OwnDrawProc(hDlg, message, wParam, lParam) HWND hDlg; // window handle of dialog box UINT message; // type of message UINT wParam; // message-specific information LONG lParam; { HDC hdcMem; LPDRAWITEMSTRUCT lpdis; switch (message) { case WM_INITDIALOG: // hinst, hbm1 and hbm2 are defined globally. hbm1 = LoadBitmap((HANDLE) hinst, "OwnBit1"); hbm2 = LoadBitmap((HANDLE) hinst, "OwnBit2");
return TRUE; case WM_DRAWITEM: lpdis = (LPDRAWITEMSTRUCT) lParam; hdcMem = CreateCompatibleDC(lpdis->hDC); if (lpdis->itemState & ODS_SELECTED) // if selected SelectObject(hdcMem, hbm2); else SelectObject(hdcMem, hbm1); // Destination StretchBlt( lpdis->hDC, // destination DC lpdis->rcItem.left, // x upper left
lpdis->rcItem.top, // y upper left // The next two lines specify the width and // height. lpdis->rcItem.right - lpdis->rcItem.left, lpdis->rcItem.bottom - lpdis->rcItem.top, hdcMem, // source device context 0, 0, // x and y upper left 32, // source bitmap width 32, // source bitmap height
SRCCOPY); // raster operation DeleteDC(hdcMem); return TRUE; case WM_COMMAND: if (wParam == IDOK || wParam == IDCANCEL) { EndDialog(hDlg, TRUE); return TRUE; } if (HIWORD(wParam) == BN_CLICKED) { switch (LOWORD(wParam)) { case IDB_OWNERDRAW: . . // application-defined processing
. break; } } break; case WM_DESTROY: DeleteObject(hbm1); // delete bitmaps DeleteObject(hbm2); break; } return FALSE; UNREFERENCED_PARAMETER(lParam); }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Использование Кнопок Owner-Drawn
Родительское окно сделанной кнопки владельца обычно реагирует на по крайней мере три сообщения для кнопки: WM_INITDIALOG, WM_COMMAND, и WM_DRAWITEM. Нет необходимости обрабатывать сообщение WM_MEASUREITEM для сделанных кнопок владельца.
Когда Вы должны закрасить сделанную кнопку владельца, Окно посылает родительскому окну сообщение WM_DRAWITEM чьих точек lParam на структуру DRAWITEMSTRUCT. Используйте эту структуру со всеми сделавшим элементами управления владельца, чтобы обеспечивать приложение информацией, которая требует закрашивать управление. itemAction И участники itemState структуры DRAWITEMSTRUCT определяют как, чтобы закрашивать сделанную кнопку владельца. Следующий пример показывает как, чтобы обрабатывать WM_INITDIALOG, WM_DRAWITEM, и сообщения WM_COMMAND для сделанных кнопок владельца. Этот пример демонстрирует как, чтобы делать одно из двух побитовых отображений для управления, или управление выбрано. Вы должны обычно использовать параметр wParam сообщения WM_DRAWITEM, чтобы идентифицировать управление; в этом примере, только одно управление принято.
LRESULT APIENTRY OwnDrawProc(hDlg, СООБЩЕНИЕ, wParam, lParam) HWND hDlg; // ручка окна диалогового сообщения блока UINT; // тип сообщения UINT wParam; // сообщеняя-специфическая информация ДОЛГО (ДЛИНОЙ) lParam; { HDC hdcMem; lpdis LPDRAWITEMSTRUCT; ключ (сообщение) { случай WM_INITDIALOG: // hinst, hbm1 и hbm2 определяться глобально. hbm1 = LoadBitmap((РУЧКА) hinst, "OwnBit1"); hbm2 = LoadBitmap((РУЧКА) hinst, "OwnBit2");
возвращайтесь ВЕРНО; случай WM_DRAWITEM: lpdis = (LPDRAWITEMSTRUCT) lParam; hdcMem = CreateCompatibleDC(lpdis->hDC); если (lpdis->itemState & ODS_SELECTED) // если выбрано SelectObject(hdcMem, hbm2); еще SelectObject(hdcMem, hbm1); // Destination StretchBlt( lpdis->hDC, // расположение DC lpdis->rcItem.left, // x верхний левый
lpdis->rcItem.top, // y верхний левый // Следующие две строки определяют ширину и // высоту. lpdis->rcItem.right - lpdis->rcItem.left, lpdis->rcItem.bottom - lpdis->rcItem.top, hdcMem, // исходный контекст устройства 0, 0, // x и y верхние левые 32, // исходная ширина побитового отображения 32, // исходная высота побитового отображения
SRCCOPY); // растровая операция DeleteDC(hdcMem); возвращайтесь ВЕРНО; случай WM_COMMAND: если (wParam == IDOK || wParam == IDCANCEL) { EndDialog(hDlg, TRUE); возвращайтесь ВЕРНО; } если (HIWORD(wParam) == BN_CLICKED) { ключ (LOWORD(wParam)) { случай IDB_OWNERDRAW: . . // определенная прикладная обработка
. прерывание; } } прерывание; случай WM_DESTROY: DeleteObject(hbm1); // удалите побитовые отображения DeleteObject(hbm2); прерывание; } обратная ЛОЖЬ; UNREFERENCED_PARAMETER(lParam); }
|
|
|
|
| |