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);
}
}
Если запустить приложение, то видно, что бэкграунд рисуется только под надписью. Несмотря на размер кнопки, больший размера надписи, половина кнопки не закрашена. Как отрисовать весь прямоугольник кнопки в соответствии с размерами, с которыми она была создана?
|
|
|
|