Среда, 20.09.2017, 03:26 Приветствую вас Гость | Группа "Гости" 


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: Волк-1024 
delfcode » Delphi » Windows API в Delphi » Owner Draw кнопки, бэкграунд рисуется только для части кнопк
Owner Draw кнопки, бэкграунд рисуется только для части кнопк
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);
    }
}


Если запустить приложение, то видно, что бэкграунд рисуется только под надписью. Несмотря на размер кнопки, больший размера надписи, половина кнопки не закрашена. Как отрисовать весь прямоугольник кнопки в соответствии с размерами, с которыми она была создана?
 
delfcode » Delphi » Windows API в Delphi » Owner Draw кнопки, бэкграунд рисуется только для части кнопк
Страница 1 из 11
Поиск:

delfcode.ru © 2008 - 2017 Хостинг от uCoz