2013-09-11 12 views
8

Я искал это много раз, но все, что я нахожу, это MFC. Я хочу его в C++ WinAPI. Я знаю, как изменить стиль кнопки управления, но я не могу понять, как сделать кнопку другого цвета. Итак, как я могу изменить цвет фона элемента управления кнопкой WinAPI с помощью C++? Я не хочу делать это с файлом ресурсов.Как изменить цвет фона кнопки WinAPI C++

Спасибо!

+0

возможный дубликат из [как установить цвет фона и цвет текста кнопки win32 api C++?] (http://stackoverflow.com/questions/6302850/how-to-set-win32-api-c-button-background-color-and-text -color) –

+0

@RogerRowland Это использование файлов ресурсов. Я хочу использовать весь код C++. – retsgorf297

+0

Я думаю, что ответы на этот вопрос актуальны для вас - тот факт, что вопрос использовал файлы ресурсов, не имеет никакого значения. –

ответ

7

Вместо ссылки я просто опубликовать копию с моего другого поста, используя пользовательский волочения, аналогичный alwayslearningnewstuff Например:

Nothing is selected First button is selected and was pushed Second button was pushed and the mouse is over it (notice the increse of brightness - cutom hilight)

Первая фотография показывает, когда ничего , вторая показывает, когда выбрана первая кнопка и была нажата, и последняя показывает, когда вторая кнопка была нажата, а мышь над ней (обратите внимание на увеличение яркости - himight cutom). Чтобы сделать это, вы должны поймать сообщение NM_CUSTOMDRAW и кнопку рисования самостоятельно. И так вы это делаете. Также добавлена ​​функция кисти градиента и некоторые комментарии.

#pragma comment(linker,"\"/manifestdependency:type='win32' \ 
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ 
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 

#include <Windows.h> 
#include <Commctrl.h> 

#define IDC_EXIT_BUTTON 101 
#define IDC_PUSHLIKE_BUTTON 102 

HBRUSH CreateGradientBrush(COLORREF top, COLORREF bottom, LPNMCUSTOMDRAW item) 
    { 
     HBRUSH Brush = NULL; 
     HDC hdcmem = CreateCompatibleDC(item->hdc); 
     HBITMAP hbitmap = CreateCompatibleBitmap(item->hdc, item->rc.right-item->rc.left, item->rc.bottom-item->rc.top); 
     SelectObject(hdcmem, hbitmap); 

     int r1 = GetRValue(top), r2 = GetRValue(bottom), g1 = GetGValue(top), g2 = GetGValue(bottom), b1 = GetBValue(top), b2 = GetBValue(bottom); 
     for(int i = 0; i < item->rc.bottom-item->rc.top; i++) 
     { 
      RECT temp; 
      int r,g,b; 
      r = int(r1 + double(i * (r2-r1)/item->rc.bottom-item->rc.top)); 
      g = int(g1 + double(i * (g2-g1)/item->rc.bottom-item->rc.top)); 
      b = int(b1 + double(i * (b2-b1)/item->rc.bottom-item->rc.top)); 
      Brush = CreateSolidBrush(RGB(r, g, b)); 
      temp.left = 0; 
      temp.top = i; 
      temp.right = item->rc.right-item->rc.left; 
      temp.bottom = i + 1; 
      FillRect(hdcmem, &temp, Brush); 
      DeleteObject(Brush); 
     } 
     HBRUSH pattern = CreatePatternBrush(hbitmap); 

     DeleteDC(hdcmem); 
     DeleteObject(Brush); 
     DeleteObject(hbitmap); 

     return pattern; 
    } 

LRESULT CALLBACK MainWindow(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    static HBRUSH defaultbrush = NULL; 
    static HBRUSH hotbrush = NULL; 
    static HBRUSH selectbrush = NULL; 
    static HBRUSH push_uncheckedbrush = NULL; 
    static HBRUSH push_checkedbrush = NULL; 
    static HBRUSH push_hotbrush1 = NULL; 
    static HBRUSH push_hotbrush2 = NULL; 
    switch (msg) 
    { 
     case WM_CREATE: 
      { 
       HWND Exit_Button = CreateWindowEx(NULL, L"BUTTON", L"EXIT", 
                 WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 
                 50, 50, 100, 100, hwnd, (HMENU)IDC_EXIT_BUTTON, NULL, NULL); 
       if(Exit_Button == NULL) 
        { 
         MessageBox(NULL, L"Button Creation Failed!", L"Error!", MB_ICONEXCLAMATION); 
         exit(EXIT_FAILURE); 
        } 

       HWND Pushlike_Button = CreateWindowEx(NULL, L"BUTTON", L"PUSH ME!", 
                 WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_PUSHLIKE, 
                 200, 50, 100, 100, hwnd, (HMENU)IDC_PUSHLIKE_BUTTON, NULL, NULL); 
       if(Pushlike_Button == NULL) 
        { 
         MessageBox(NULL, L"Button Creation Failed!", L"Error!", MB_ICONEXCLAMATION); 
         exit(EXIT_FAILURE); 
        } 
      } 
     break; 
     case WM_COMMAND: 
      { 
       switch(LOWORD(wParam)) 
        { 
         case IDC_EXIT_BUTTON: 
          { 
           SendMessage(hwnd, WM_CLOSE, 0, 0); 
          } 
         break; 
        } 
      } 
     break; 
     case WM_NOTIFY: 
     { 
      LPNMHDR some_item = (LPNMHDR)lParam; 

      if (some_item->idFrom == IDC_EXIT_BUTTON && some_item->code == NM_CUSTOMDRAW) 
      { 
       LPNMCUSTOMDRAW item = (LPNMCUSTOMDRAW)some_item; 

       if (item->uItemState & CDIS_SELECTED) 
       { 
        //Select our color when the button is selected 
        if (selectbrush == NULL) 
         selectbrush = CreateGradientBrush(RGB(180, 0, 0), RGB(255, 180, 0), item); 

        //Create pen for button border 
        HPEN pen = CreatePen(PS_INSIDEFRAME, 0, RGB(0, 0, 0)); 

        //Select our brush into hDC 
        HGDIOBJ old_pen = SelectObject(item->hdc, pen); 
        HGDIOBJ old_brush = SelectObject(item->hdc, selectbrush); 

        //If you want rounded button, then use this, otherwise use FillRect(). 
        RoundRect(item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom, 5, 5); 

        //Clean up 
        SelectObject(item->hdc, old_pen); 
        SelectObject(item->hdc, old_brush); 
        DeleteObject(pen); 

        //Now, I don't want to do anything else myself (draw text) so I use this value for return: 
        return CDRF_DODEFAULT; 
        //Let's say I wanted to draw text and stuff, then I would have to do it before return with 
        //DrawText() or other function and return CDRF_SKIPDEFAULT 
       } 
       else 
       { 
        if (item->uItemState & CDIS_HOT) //Our mouse is over the button 
        { 
         //Select our color when the mouse hovers our button 
         if (hotbrush == NULL) 
          hotbrush = CreateGradientBrush(RGB(255, 230, 0), RGB(245, 0, 0), item); 

         HPEN pen = CreatePen(PS_INSIDEFRAME, 0, RGB(0, 0, 0)); 

         HGDIOBJ old_pen = SelectObject(item->hdc, pen); 
         HGDIOBJ old_brush = SelectObject(item->hdc, hotbrush); 

         RoundRect(item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom, 5, 5); 

         SelectObject(item->hdc, old_pen); 
         SelectObject(item->hdc, old_brush); 
         DeleteObject(pen); 

         return CDRF_DODEFAULT; 
        } 

        //Select our color when our button is doing nothing 
        if (defaultbrush == NULL) 
         defaultbrush = CreateGradientBrush(RGB(255, 180, 0), RGB(180, 0, 0), item); 

        HPEN pen = CreatePen(PS_INSIDEFRAME, 0, RGB(0, 0, 0)); 

        HGDIOBJ old_pen = SelectObject(item->hdc, pen); 
        HGDIOBJ old_brush = SelectObject(item->hdc, defaultbrush); 

        RoundRect(item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom, 5, 5); 

        SelectObject(item->hdc, old_pen); 
        SelectObject(item->hdc, old_brush); 
        DeleteObject(pen); 

        return CDRF_DODEFAULT; 
       } 
      } 
      else if (some_item->idFrom == IDC_PUSHLIKE_BUTTON && some_item->code == NM_CUSTOMDRAW) 
      { 
       LPNMCUSTOMDRAW item = (LPNMCUSTOMDRAW)some_item; 

       if (IsDlgButtonChecked(hwnd, some_item->idFrom)) 
       { 
        if (item->uItemState & CDIS_HOT) 
        { 

         if (push_hotbrush1 == NULL) 
          push_hotbrush1 = CreateGradientBrush(RGB(0, 0, 245), RGB(0, 230, 255), item); 

         HPEN pen = CreatePen(PS_INSIDEFRAME, 0, RGB(0, 0, 0)); 

         HGDIOBJ old_pen = SelectObject(item->hdc, pen); 
         HGDIOBJ old_brush = SelectObject(item->hdc, push_hotbrush1); 

         RoundRect(item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom, 10, 10); 

         SelectObject(item->hdc, old_pen); 
         SelectObject(item->hdc, old_brush); 
         DeleteObject(pen); 

         return CDRF_DODEFAULT; 
        } 


        if (push_checkedbrush == NULL) 
         push_checkedbrush = CreateGradientBrush(RGB(0, 0, 180), RGB(0, 222, 200), item); 


        HPEN pen = CreatePen(PS_INSIDEFRAME, 0, RGB(0, 0, 0)); 


        HGDIOBJ old_pen = SelectObject(item->hdc, pen); 
        HGDIOBJ old_brush = SelectObject(item->hdc, push_checkedbrush); 


        RoundRect(item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom, 10, 10); 


        SelectObject(item->hdc, old_pen); 
        SelectObject(item->hdc, old_brush); 
        DeleteObject(pen); 


        return CDRF_DODEFAULT; 
       } 
       else 
       { 
        if (item->uItemState & CDIS_HOT) 
        { 
         if (push_hotbrush2 == NULL) 
          push_hotbrush2 = CreateGradientBrush(RGB(255, 230, 0), RGB(245, 0, 0), item); 

         HPEN pen = CreatePen(PS_INSIDEFRAME, 0, RGB(0, 0, 0)); 

         HGDIOBJ old_pen = SelectObject(item->hdc, pen); 
         HGDIOBJ old_brush = SelectObject(item->hdc, push_hotbrush2); 

         RoundRect(item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom, 10, 10); 

         SelectObject(item->hdc, old_pen); 
         SelectObject(item->hdc, old_brush); 
         DeleteObject(pen); 

         return CDRF_DODEFAULT; 
        } 

        if (push_uncheckedbrush == NULL) 
         push_uncheckedbrush = CreateGradientBrush(RGB(255, 180, 0), RGB(180, 0, 0), item); 

        HPEN pen = CreatePen(PS_INSIDEFRAME, 0, RGB(0, 0, 0)); 

        HGDIOBJ old_pen = SelectObject(item->hdc, pen); 
        HGDIOBJ old_brush = SelectObject(item->hdc, defaultbrush); 

        RoundRect(item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom, 10, 10); 

        SelectObject(item->hdc, old_pen); 
        SelectObject(item->hdc, old_brush); 
        DeleteObject(pen); 

        return CDRF_DODEFAULT; 
       } 
      } 
      return CDRF_DODEFAULT; 
     } 
     break; 
     case WM_CTLCOLORBTN: //In order to make those edges invisble when we use RoundRect(), 
      {    //we make the color of our button's background match window's background 
       return (LRESULT)GetSysColorBrush(COLOR_WINDOW+1); 
      } 
     break; 
     case WM_CLOSE: 
      { 
       DestroyWindow(hwnd); 
       return 0; 
      } 
     break; 
     case WM_DESTROY: 
      { 
       DeleteObject(defaultbrush); 
       DeleteObject(selectbrush); 
       DeleteObject(hotbrush); 
       DeleteObject(push_checkedbrush); 
       DeleteObject(push_hotbrush1); 
       DeleteObject(push_hotbrush2); 
       DeleteObject(push_uncheckedbrush); 
       PostQuitMessage(0); 
       return 0; 
      } 
     break; 
     default: 
      return DefWindowProc(hwnd, msg, wParam, lParam); 
    } 
    return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    WNDCLASSEX wc; 
    HWND hwnd; 
    MSG msg; 
    const wchar_t ClassName[] = L"Main_Window"; 

    wc.cbSize  = sizeof(WNDCLASSEX); 
    wc.style   = 0; 
    wc.lpfnWndProc = MainWindow; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance  = hInstance; 
    wc.hIcon   = LoadIcon(NULL, IDI_APPLICATION); 
    wc.hCursor  = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW+1); 
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = ClassName; 
    wc.hIconSm  = LoadIcon(NULL, IDI_APPLICATION); 

    if(!RegisterClassEx(&wc)) 
    { 
     MessageBox(NULL, L"Window Registration Failed!", L"Error", MB_ICONEXCLAMATION | MB_OK); 
     exit(EXIT_FAILURE); 
    } 

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, ClassName, L"Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 368, 248, NULL, NULL, hInstance, NULL); 

    if(hwnd == NULL) 
    { 
     MessageBox(NULL, L"Window Creation Failed!", L"Error!", MB_ICONEXCLAMATION | MB_OK); 
     exit(EXIT_FAILURE); 
    } 

    ShowWindow(hwnd, nCmdShow); 
    UpdateWindow(hwnd); 

    while(GetMessage(&msg, NULL, 0, 0) > 0) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    return msg.message; 
} 
+3

Это выглядит очень хорошо, +1 от меня. Я думаю, что у ОП теперь достаточно информации, чтобы успешно решить проблему. – AlwaysLearningNewStuff

+0

Спасибо! Я могу выбрать только один, чтобы ответить на мой вопрос, но AlwaysLearningNewStuff будет вторым. – retsgorf297

+0

_you должен поймать NM_CUSTOMDRAW_ ... Это не единственный способ, вы также можете создать кнопку рисования владельца с помощью стиля 'BS_OWNERDRAW'. – zett42

1

Для этого вам нужен owner-drawn button. По какой-то причине, в отличие от других элементов управления, обычные кнопки не реагируют на изменения, внесенные в обработчик сообщений WM_CTLCOLORBTN.

+0

Я слышал об этом, но можете ли вы объяснить это больше? – retsgorf297

+0

Ну, я думаю, я достаточно об этом знаю. Спасибо! – retsgorf297

4

Я не помню ссылку на исходный код, но код ниже помог мне в прошлом решить проблему, с которой вы сталкиваетесь в настоящее время.

Обратите внимание, что у него нет файла ресурсов, как вы просили, и находится в обычном API Win32.

Изучите это внимательно, все прокомментирует оригинал автора.

Надеюсь, это поможет вам, поскольку это помогло мне в прошлом.

Если у вас есть какие-либо вопросы, спросите, я постараюсь ответить на них.

Есть 4 способа, насколько я знаю, чтобы изменить цвет кнопки:

  1. Владелец привлечь (очевидное решение).

  2. Пользовательский ничья (на мой взгляд лучшее решение).

  3. Подкласса контроль (не нравится, но это возможно).

  4. растровые изображения как фон на кнопках.

  5. Обработка WM_CTLCOLORBTN:

Из MSDN:

только владелец нарисованные кнопки реагируют на обработку родительского окна это сообщение.

Акцент - мой. Если вы планируете использовать эту опцию, внимательно прочитайте Remarks section.

Код внизу демонстрирует случаи 1, 2 и 4.

#pragma comment(linker, "/manifestdependency:\"type='win32' \ 
    name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ 
    processorArchitecture='*' \ 
    publicKeyToken='6595b64144ccf1df' language='*'\"") 

#pragma comment(lib, "comctl32.lib") 

#include <windows.h> 
#include <commctrl.h> 

ATOM RegisterWndClass(HINSTANCE hInst); 

BOOL CreateMainWnd(HINSTANCE hInstance, int nCmdShow); 

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); 

HINSTANCE hInst; 

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hInstPrev, LPWSTR lpszCmdLine, 
    int nCmdShow) 
{ 
    INITCOMMONCONTROLSEX icex = {0}; 
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX); 
    icex.dwICC = ICC_LISTVIEW_CLASSES | ICC_USEREX_CLASSES | ICC_BAR_CLASSES | 
        ICC_COOL_CLASSES | ICC_TAB_CLASSES | ICC_WIN95_CLASSES | 
        ICC_PROGRESS_CLASS | ICC_PAGESCROLLER_CLASS; 

    InitCommonControlsEx(&icex); 

    MSG msg; 

    hInst = hInstance; 

    if (!RegisterWndClass(hInstance)) 
     return NULL; 

    if (!CreateMainWnd(hInstance, nCmdShow)) 
     return NULL; 

    while (GetMessage(&msg, NULL, NULL, NULL)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return msg.wParam; 
}; 

ATOM RegisterWndClass(HINSTANCE hInstance) 
{ 

    WNDCLASS wndClass = {0}; 
    wndClass.style = CS_DBLCLKS; 
    wndClass.lpfnWndProc = MainWndProc; 
    wndClass.hInstance = hInstance; 
    wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wndClass.hbrBackground = GetSysColorBrush(COLOR_BTNFACE); 
    wndClass.lpszMenuName = NULL; 
    wndClass.lpszClassName = L"MainClass"; 
    wndClass.cbClsExtra = 0; 
    wndClass.cbWndExtra = 0; 

    return RegisterClass(&wndClass); 
} 

BOOL CreateMainWnd(HINSTANCE hInstance, int nCmdShow) 
{ 
    HWND hWnd = CreateWindow(L"MainClass", L"Buttons sample", 
     WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, 
     GetSystemMetrics(SM_CXSCREEN)/2 - 115, 
     GetSystemMetrics(SM_CYSCREEN)/2 - 50, 
     230, 100, NULL, NULL, hInstance, NULL); 

    if (!hWnd) 
     return FALSE; 

    ShowWindow(hWnd, nCmdShow); 
    UpdateWindow(hWnd); 

    return TRUE; 
} 

HBITMAP hBitmap = NULL; 

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (msg) 
    { 
    case WM_CREATE: 
     { 
      // Owner draw button 

      CreateWindow(L"BUTTON", L"", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | 
       BS_OWNERDRAW, 10, 10, 60, 30, hWnd, 
       (HMENU)10001, hInst, NULL); 

      // Custom draw button 

      CreateWindow(L"BUTTON", L"", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 80, 
       10, 60, 30, hWnd, (HMENU)10002, hInst, NULL); 

      // Bitmap button 

      HWND hBitmapButton = CreateWindow(L"BUTTON", L"", WS_CHILD | WS_VISIBLE 
       | BS_PUSHBUTTON | BS_BITMAP, 
       150, 10, 60, 30, hWnd, 
       (HMENU)10003, hInst, NULL); 

      HDC hDC = GetDC(hWnd); 

      HDC hMemDC = CreateCompatibleDC(hDC); 

      hBitmap = CreateCompatibleBitmap(hDC, 55, 25); 

      SelectObject(hMemDC, hBitmap); 

      SetDCBrushColor(hMemDC, RGB(0, 0, 255)); 

      RECT r = {0}; 
      r.left = 0; 
      r.right = 55; 
      r.top = 0; 
      r.bottom = 25; 

      FillRect(hMemDC, &r, (HBRUSH)GetStockObject(DC_BRUSH)); 

      DeleteDC(hMemDC); 
      ReleaseDC(hWnd, hDC); 

      SendMessage(hBitmapButton, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, 
       (LPARAM)hBitmap); 

      return 0; 
     } 

    case WM_COMMAND: 
     switch (LOWORD(wParam)) 
     { 
     case 10001: 
      MessageBox(hWnd, L"Owner draw button clicked", L"Message", NULL); 
      return 0; 
     case 10002: 
      MessageBox(hWnd, L"Custom draw button clicked", L"Message", NULL); 
      return 0; 
     case 10003: 
      MessageBox(hWnd, L"Bitmap button clicked", L"Message", NULL); 
      return 0; 
     } 
     break; 

    // Owner draw button 

    case WM_DRAWITEM: 
     if (wParam == 10001) 
     { 
      LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT)lParam; 

      SetDCBrushColor(lpDIS -> hDC, RGB(255, 0, 0)); 

      SelectObject(lpDIS -> hDC, GetStockObject(DC_BRUSH)); 

      RoundRect(lpDIS -> hDC, lpDIS -> rcItem.left, lpDIS -> rcItem.top, 
       lpDIS -> rcItem.right, lpDIS -> rcItem.bottom, 5, 5); 

      return TRUE; 
     } 
     break; 

    // Custom draw button 

    case WM_NOTIFY: 
     switch (((LPNMHDR)lParam) -> code) 
     { 
     case NM_CUSTOMDRAW: 
      if (((LPNMHDR)lParam) -> idFrom == 10002) 
      { 
       LPNMCUSTOMDRAW lpnmCD = (LPNMCUSTOMDRAW)lParam; 

       switch (lpnmCD -> dwDrawStage) 
       { 
       case CDDS_PREPAINT: 

        SetDCBrushColor(lpnmCD -> hdc, RGB(0, 255, 0)); 
        SetDCPenColor(lpnmCD -> hdc, RGB(0, 255, 0)); 
        SelectObject(lpnmCD -> hdc, GetStockObject(DC_BRUSH)); 
        SelectObject(lpnmCD -> hdc, GetStockObject(DC_PEN)); 

        RoundRect(lpnmCD -> hdc, lpnmCD -> rc.left + 3, 
         lpnmCD -> rc.top + 3, 
         lpnmCD -> rc.right - 3, 
         lpnmCD -> rc.bottom - 3, 5, 5); 

        return TRUE; 
       } 
      } 
      break; 
     } 
     break; 

    case WM_DESTROY: 
     if (hBitmap != NULL) 
      DeleteObject((HBITMAP)hBitmap); 
     PostQuitMessage(0); 
     return 0; 
    } 
    return DefWindowProc(hWnd, msg, wParam, lParam); 
} 
+0

Я тоже узнал из этого кода :). Я даже создал свой собственный класс пользовательского рисования, но в конце концов мне пришлось создать свою собственную кнопку. Тем не менее, как Microsoft создает этот синий эффект синего света вокруг кнопки? Градиент пути? – FrogTheFrog

3

Вы можете редактировать кнопку (которая имеет BS_OWNERDRAW флаг) в WM_DRAWITEM сообщение на DialogProc (MSDN About WM_DRAWITEM), Херес простой пример того, как сделать простую кнопку:

LPDRAWITEMSTRUCT Item; 
    Item = (LPDRAWITEMSTRUCT)lParam; 
    SelectObject(Item->hDC, CreateFont(16, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Arial Black")); 
    FillRect(Item->hDC, &Item->rcItem, CreateSolidBrush(0)); 
    SelectObject(Item->hDC, CreateSolidBrush(0)); 
    if (Item->itemState & ODS_SELECTED) 
    { 
     SetTextColor(Item->hDC, 0); 
     SelectObject(Item->hDC, CreateSolidBrush(0xFF00)); 
     SelectObject(Item->hDC, CreatePen(PS_SOLID, 2, 0xFF00)); 
    } 
    else 
    { 
     SetTextColor(Item->hDC, 0x00FF00); 
     SelectObject(Item->hDC, CreatePen(PS_SOLID, 2, 0x00FF00)); 

    } 
    SetBkMode(Item->hDC, TRANSPARENT); 
    RoundRect(Item->hDC, Item->rcItem.left, Item->rcItem.top, Item->rcItem.right, Item->rcItem.bottom, 20, 20); 
    int len; 
    len = GetWindowTextLength(Item->hwndItem); 
    LPSTR lpBuff; 
    lpBuff = new char[len+1]; 
    GetWindowTextA(Item->hwndItem, lpBuff, len+1); 
    DrawTextA(Item->hDC, lpBuff, len, &Item->rcItem, DT_CENTER); 
Смежные вопросы