Aoizora | Дата: Пятница, 18.11.2016, 15:50 | Сообщение # 1 |
Новичок
Зарегистрирован: 18.11.2016
Группа: Пользователи
Сообщений: 4
Статус: Offline
| Хочу сделать Owner Draw кнопку на форме, но не получается правильно реализовать смену бэкграунда при клике. Показываю код:
Код #include <windows.h> #include "intrinsic.h"
#pragma comment(lib, "user32.lib") #pragma comment(lib, "msimg32.lib")
#define ID_KEY_FIELD 3000 #define ID_KEY_ENTER 3001
void ShowMainWindow(void);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // Пропуск кода, выполняющегося перед созданием формы // Main logic goes here... ShowMainWindow(); }
void RegisterWndClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground) { WNDCLASSEX wc;
wc.cbSize = sizeof(wc); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = Proc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = GetModuleHandle(NULL); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = CreateSolidBrush(RGB(0x14, 0x14, 0x14));; wc.lpszMenuName = NULL; wc.lpszClassName = szName; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if (!RegisterClassEx(&wc)) { MessageBox(NULL, TEXT("Cannot register class"), TEXT("Error"), MB_OK); } }
void DrawButton(DRAWITEMSTRUCT *dis, HWND hwnd) { RECT rc; GetClientRect(hwnd, &rc);
if (dis->itemState & ODS_SELECTED) { SetBkColor(dis->hDC, RGB(0x00, 0x8C, 0xBA)); //FillRect(dis->hDC, &rc, RGB(0x00, 0x9C, 0xCA)); } else { SetBkColor(dis->hDC, RGB(0x00, 0xAC, 0xDA)); //FillRect(dis->hDC, &rc, RGB(0x00, 0x8C, 0xBA)); }
//SetBkMode(dis->hDC, TRANSPARENT); FillRect(dis->hDC, &rc, RGB(0x00, 0x00, 0x00));
char buf[255]; GetWindowText(hwnd, buf, 255); DrawText(dis->hDC, buf, lstrlen(buf), &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE); }
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HDC hDC; PAINTSTRUCT ps; RECT rect;
switch (uMsg) { case WM_CREATE: CreateWindow(TEXT("EDIT"), NULL, WS_VISIBLE | WS_CHILD | ES_LEFT | ES_AUTOHSCROLL, 10, 280, 350, 20, hWnd, (HMENU)ID_KEY_FIELD, NULL, NULL); CreateWindow(TEXT("BUTTON"), TEXT("Enter"), WS_VISIBLE | WS_CHILD | BS_OWNERDRAW, 370, 280, 150, 20, hWnd, (HMENU)ID_KEY_ENTER, GetModuleHandle(NULL), NULL); break; case WM_PAINT: hDC = BeginPaint(hWnd, &ps); GetClientRect(hWnd, &rect); EndPaint(hWnd, &ps); break; case WM_CTLCOLOREDIT: { HDC hdc = (HDC)wParam; HWND hwnd = (HWND)lParam; if (GetDlgCtrlID(hwnd) == ID_KEY_FIELD) { SetTextColor(hdc, RGB(0x51, 0x51, 0x51)); SetBkColor(hdc, RGB(0x29, 0x29, 0x29)); return (LRESULT)CreateSolidBrush(RGB(0x29, 0x29, 0x29)); } break; } case WM_DRAWITEM: { DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT*)lParam; switch (dis->CtlID) { case ID_KEY_ENTER: DrawButton(dis, GetDlgItem(hWnd, ID_KEY_ENTER)); break; } } case WM_SIZE: break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; }
void ShowMainWindow(void) { HWND hMainWnd; MSG msg;
RegisterWndClass(WndProc, TEXT("Info"), COLOR_WINDOW); hMainWnd = CreateWindow(TEXT("Info"), TEXT("Info"), WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, 0, 550, 350, (HWND)NULL, (HMENU)NULL, (HINSTANCE)GetModuleHandle(NULL), NULL);
if (!hMainWnd) { MessageBox(NULL, TEXT("Can\'t create main window."), TEXT("Error"), MB_OK); return GetLastError(); }
ShowWindow(hMainWnd, SW_SHOW);
while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
Если запустить приложение, то видно, что бэкграунд рисуется только под надписью. Несмотря на размер кнопки, больший размера надписи, половина кнопки не закрашена. Как отрисовать весь прямоугольник кнопки в соответствии с размерами, с которыми она была создана?
|
|
| |