Как изменить цвет линии winapi

Как менять толщину и цвет линий по нажатию клавиши? C++ WinAPI Решение и ответ на вопрос 1149991
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#include <windows.h>
#include <math.h>
#include <string>
#include <sstream>
 
 
LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 
unsigned int lineWidth = 1;
COLORREF lineColor = RGB(0, 0, 0);
HDC hDC;
RECT rcClient;                 
POINT ptClientUL;             
POINT ptClientLR;              
static POINTS ptsBegin;       
static POINTS ptsEnd;         
static POINTS ptsPrevEnd;      
static BOOL fPrevLine = FALSE; 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, TEXT("Вход"), TEXT("Начать рисование"), 0);
 
 
    WNDCLASSEX WindowClass;
 
    static LPCTSTR szAppName = L"WinApi";
    HWND hWnd;
    MSG msg;
    WNDCLASSEX wc;
 
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(0, IDI_HAND);
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITENESS));
    wc.lpszMenuName = 0;
    wc.lpszClassName = szAppName;
    wc.hIconSm = 0;
 
    RegisterClassEx(&wc);
    hWnd = CreateWindow(szAppName, NULL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, 0);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    hDC = GetDC(hWnd);
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return static_cast<int>(msg.wParam);
}
 
LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 
    PAINTSTRUCT PaintSt;
    RECT aRect;
    switch (message)
 
    {
 
    case WM_PAINT:
    {
        hDC = BeginPaint(hWnd, &PaintSt);
        GetClientRect(hWnd, &aRect);
        SetBkMode(hDC, TRANSPARENT);
        DrawText(hDC, L"Рисовалка", -1, &aRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
        RECT widthRect = { 300, 0, 480, 50 }, widthValueRect = { 480, 0, 520, 50 },
        colorRect = { 520, 0, 630, 50 }, colorValueRect = { 630, 0, 900, 50 };
 
        RECT infoRect = { 300, 0, 900, 50 };
        FillRect(hDC, &infoRect, (HBRUSH)(COLOR_WINDOW + 1));
        DrawText(hDC, L"Текущая толщина линии:", -1, &widthRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
        DrawText(hDC, std::to_wstring(lineWidth).c_str(), -1, &widthValueRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
        DrawText(hDC, L"Текущий цвет:", -1, &colorRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
        std::wstringstream wss;
        wss << L"R: " << GetRValue(lineColor) << L" | " << L"G: " << GetGValue(lineColor) << L" | " << L"B: " << GetBValue(lineColor);
        DrawText(hDC, wss.str().c_str(), -1, &colorValueRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
 
 
        HBRUSH hBrush;
        CreateSolidBrush(RGB(255, 0, 67));
        hBrush = CreateHatchBrush(HS_FDIAGONAL, RGB(255, 10, 20));
        SelectObject(hDC, hBrush);
        Ellipse(hDC, 100, 100, 200, 300);
 
 
        HPEN hPen1, hPen2, hPen3;
        hPen1 = CreatePen(PS_DASHDOT, 1, RGB(0, 0, 255));
        hPen2 = CreatePen(PS_DASH, 1, RGB(255, 0, 255));
        hPen3 = CreatePen(PS_DOT, 1, RGB(0, 128, 256));
 
        SelectObject(hDC, hPen1);
        Rectangle(hDC, 10, 10, 100, 100);
 
        SelectObject(hDC, hPen2);
        Arc(hDC, 10, 20, 30, 40, 50, 60, 300, 400);
 
        SelectObject(hDC, hPen3);
        RoundRect(hDC, 200, 100, 140, 150, 160, 170);
        EndPaint(hWnd, &PaintSt);
    }
        break;
    case WM_LBUTTONDOWN:
    
        SetCapture(hWnd);
        
        GetClientRect(hWnd, &rcClient);
        ptClientUL.x = rcClient.left;
        ptClientUL.y = rcClient.top;
 
        ptClientLR.x = rcClient.right + 1;
        ptClientLR.y = rcClient.bottom + 1;
        ClientToScreen(hWnd, &ptClientUL);
        ClientToScreen(hWnd, &ptClientLR);
 
        SetRect(&rcClient, ptClientUL.x, ptClientUL.y, ptClientLR.x, ptClientLR.y);
        ClipCursor(&rcClient);
 
        ptsBegin = MAKEPOINTS(lParam);
        return 0;
 
    case WM_RBUTTONDOWN:
    {
            lineWidth = rand() % 19 + 1;
            lineColor = RGB(rand() % 255, rand() % 255, rand() % 255);
            InvalidateRect(hWnd, NULL, TRUE);
 
            
            /*ptsEnd.x = LOWORD(lParam);
            ptsEnd.y = HIWORD(lParam);*/
            
 
            HPEN linePen;
            linePen = CreatePen(PS_SOLID, lineWidth, lineColor);
            HGDIOBJ prevObj = SelectObject(hDC, linePen);
            LineTo(hDC, ptsEnd.x, ptsEnd.y);
            SelectObject(hDC, prevObj);
            DeleteObject(linePen);
            InvalidateRect(hWnd, NULL, TRUE);
 
    }
        break;
    case WM_MOUSEMOVE:
        
        if (wParam & MK_LBUTTON)
        {
 
            hDC = GetDC(hWnd);
 
            SetROP2(hDC, R2_NOTXORPEN);
 
            HPEN linePen;
            linePen = CreatePen(PS_SOLID, lineWidth, lineColor);
            HGDIOBJ prevObj = SelectObject(hDC, linePen);           
 
            if (fPrevLine)
                {
                    MoveToEx(hDC, ptsBegin.x, ptsBegin.y, (LPPOINT)NULL);
                    LineTo(hDC, ptsPrevEnd.x, ptsPrevEnd.y);
                }
 
            ptsEnd = MAKEPOINTS(lParam);
            MoveToEx(hDC, ptsBegin.x, ptsBegin.y, (LPPOINT)NULL);
            LineTo(hDC, ptsEnd.x, ptsEnd.y);
 
            SelectObject(hDC, prevObj);
            DeleteObject(linePen);
            InvalidateRect(hWnd, NULL, TRUE);
 
            fPrevLine = TRUE;
            ptsPrevEnd = ptsEnd;
            ReleaseDC(hWnd, hDC);
        }
        break;
    /*case WM_LBUTTONUP:
    //{
    //                   //
    //                   ptsEnd.x = LOWORD(lParam);
    //                   ptsEnd.y = HIWORD(lParam);
    //                   //
 
    //                   HPEN linePen;
    //                   linePen = CreatePen(PS_SOLID, lineWidth, lineColor);
    //                   HGDIOBJ prevObj = SelectObject(hDC, linePen);
    //                   LineTo(hDC, ptsEnd.x, ptsEnd.y);
    //                   SelectObject(hDC, prevObj);
    //                   DeleteObject(linePen);
    //                   InvalidateRect(hWnd, NULL, TRUE);
 
 
    //}
    //  
    //  return 0;*/
 
    case WM_DESTROY:
        
        PostQuitMessage(0);
        return 0;
 
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
 
 
 
}


Форум программистов Vingrad

Новости ·
Фриланс ·
FAQ

Правила ·
Помощь ·
Рейтинг ·
Избранное ·
Поиск ·
Участники

Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> как установить цвет линии с помощью API 

V

   

Опции темы

D1myan
  Дата 10.6.2008, 18:52 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 40
Регистрация: 22.3.2008

Репутация: нет
Всего: нет

Помогите поменять цвет и толщину линии с помощью Api. Попытка:

Код

var
 c: TCanvas;
 DC: HDC;
begin
try
  DC:=GetDC(0);
  c:=TCanvas.Create;
  c.Handle:=DC;

CreatePen(PS_SOLID, 10, 200); // так не получается
    MoveToEx(dc,0,0,nil);
    LineTo(dc,100,100);

  finally
  c.Destroy;
  ReleaseDC(0, DC);
 end;
end;

подскажите плиз что не так.

PM MAIL   Вверх
Rrader
  Дата 11.6.2008, 08:41 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Inspired =)
***

Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  Pen: HPen;
  DC: HDC;
begin
  DC := GetWindowDC(0);
  try
    Pen := CreatePen(PS_SOLID, 10, 200);
    SelectObject(DC, Pen);
    MoveToEx(DC, 0, 0, NIL);
    LineTo(DC, 100, 100);
  finally
    DeleteObject(Pen);
    ReleaseDC(0, DC);
  end;
end;

———————

Let’s do this quickly!
Rest in peace, Vit!

PM MAIL Skype   Вверх
D1myan
  Дата 11.6.2008, 10:44 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 40
Регистрация: 22.3.2008

Репутация: нет
Всего: нет

smile БОЛЬШОЕ СПС!!! ВСЕ РАБОТАЕТ smile 

PM MAIL   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «Delphi: WinAPI и системное программирование»
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »

I tried to color customize menu items (pure WinAPI). But there is a line in the menu bar which does not draw with MenuInfo.hbrBack color. If the mouse cursor hover above items a part of this line is redrawn. But if I resize the window the line will return. And in the area of menu bar where no items the line drawn constantly. How can I draw over this annoying line?

the line

#include <windows.h> 

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

struct
{
    COLORREF text = RGB(200, 200, 250);
    COLORREF clientBorder = RGB(120, 0, 0); 
    COLORREF clientBackground = RGB(100, 100, 100);
    COLORREF itemBorder = RGB(0, 0, 255);
    COLORREF itemBackground = RGB(0, 120, 0);
    COLORREF pink = RGB(255, 0, 255);
} colorTheme;

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;

    WNDCLASSEX wc;
    wc.cbSize = sizeof(wc);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "MainWindow";
    wc.cbWndExtra = NULL;
    wc.cbClsExtra = NULL;
    wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
    wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush(colorTheme.clientBackground);
    wc.hInstance = hInst;

    RegisterClassEx(&wc);

    HWND hMainWnd = CreateWindow(
        "MainWindow",
        "MainWindow",
        WS_OVERLAPPEDWINDOW,
        100, 100, 450, 120,
        (HWND)NULL, NULL, HINSTANCE(hInst), NULL);

    HMENU hMenu = CreateMenu();
    HMENU hMenuSub1 = CreatePopupMenu();
    HMENU hMenuSub2 = CreatePopupMenu();
    HMENU hMenuSub3 = CreatePopupMenu();
    AppendMenu(hMenu, MF_OWNERDRAW | MF_POPUP, (UINT)hMenuSub1, "SubMenu1");
    AppendMenu(hMenuSub1, MF_OWNERDRAW, 0, "Item01");
    AppendMenu(hMenuSub1, MF_OWNERDRAW, 0, "Item02");
    AppendMenu(hMenuSub1, MF_OWNERDRAW, 0, "Item03");
    AppendMenu(hMenuSub1, MF_OWNERDRAW, 0, "Item04");
    AppendMenu(hMenuSub1, MF_OWNERDRAW, 0, "Item05");
    AppendMenu(hMenu, MF_OWNERDRAW | MF_POPUP, (UINT)hMenuSub2, "SubMenu2");
    AppendMenu(hMenu, MF_OWNERDRAW | MF_POPUP, (UINT)hMenuSub3, "SubMenu3");
    
    MENUINFO menuInfo;
    menuInfo.cbSize = sizeof(menuInfo);
    menuInfo.fMask = MIM_BACKGROUND;
    menuInfo.hbrBack = CreateSolidBrush(colorTheme.pink);
    SetMenuInfo(hMenu, &menuInfo);
    SetMenu(hMainWnd, hMenu);

    ShowWindow(hMainWnd, nCmdShow);

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

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg) {
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hDC = BeginPaint(hWnd, &ps);

        HFONT hApplicationFont;
        LOGFONT applicationFont;
        applicationFont.lfHeight = 16;
        applicationFont.lfWidth = 6;
        applicationFont.lfEscapement = 0;
        applicationFont.lfOrientation = 0;
        applicationFont.lfWeight = FW_NORMAL;
        applicationFont.lfItalic = FALSE;
        applicationFont.lfUnderline = FALSE;
        applicationFont.lfStrikeOut = FALSE;
        applicationFont.lfCharSet = DEFAULT_CHARSET;
        applicationFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
        applicationFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
        applicationFont.lfQuality = ANTIALIASED_QUALITY;
        applicationFont.lfPitchAndFamily = DEFAULT_PITCH;
        strcpy_s(applicationFont.lfFaceName, "Arial");
        hApplicationFont = CreateFontIndirectA(&applicationFont);
        SelectObject(hDC, hApplicationFont);

        SelectObject(hDC, GetStockObject(DC_PEN));
        SetDCPenColor(hDC, colorTheme.clientBorder);
        SelectObject(hDC, GetStockObject(DC_BRUSH));
        SetDCBrushColor(hDC, colorTheme.clientBackground);
        RECT clientRect;
        GetClientRect(hWnd, &clientRect);
        Rectangle(hDC, 0, 0, clientRect.right, clientRect.bottom);

        EndPaint(hWnd, &ps);
        break;
    }
    case WM_MEASUREITEM:
    {
        LPMEASUREITEMSTRUCT itemStruct = (LPMEASUREITEMSTRUCT)lParam;
        const char* str = (const char*)(itemStruct->itemData);
        SIZE strSize;
        HDC hDC = GetDC(hWnd);          
        GetTextExtentPoint32(hDC, str, lstrlen(str), &strSize);
        itemStruct->itemWidth = strSize.cx;
        itemStruct->itemHeight = 30;
        ReleaseDC(hWnd, hDC);

        return TRUE;
        break;
    }
    case WM_DRAWITEM:
    {
        LPDRAWITEMSTRUCT itemStruct = (LPDRAWITEMSTRUCT)lParam;
        HDC hDC = itemStruct->hDC;
        SelectObject(hDC, GetStockObject(DC_PEN));
        SetDCPenColor(hDC, colorTheme.itemBorder);
        SelectObject(hDC, GetStockObject(DC_BRUSH));
        SetDCBrushColor(hDC, colorTheme.itemBackground);
        SetTextColor(hDC, colorTheme.text);
        SetBkMode(hDC, TRANSPARENT);

        Rectangle(hDC, itemStruct->rcItem.left,
                       itemStruct->rcItem.top,
                       itemStruct->rcItem.right,
                       itemStruct->rcItem.bottom + 1);
        DrawText(hDC, (const char*)(itemStruct->itemData), -1, &(itemStruct->rcItem), DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        break;
    }
    case WM_DESTROY:
    {
        PostQuitMessage(NULL);
        break;
    }
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return NULL;
}

I tried to color customize menu items (pure WinAPI). But there is a line in the menu bar which does not draw with MenuInfo.hbrBack color. If the mouse cursor hover above items a part of this line is redrawn. But if I resize the window the line will return. And in the area of menu bar where no items the line drawn constantly. How can I draw over this annoying line?

the line

#include <windows.h> 

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

struct
{
    COLORREF text = RGB(200, 200, 250);
    COLORREF clientBorder = RGB(120, 0, 0); 
    COLORREF clientBackground = RGB(100, 100, 100);
    COLORREF itemBorder = RGB(0, 0, 255);
    COLORREF itemBackground = RGB(0, 120, 0);
    COLORREF pink = RGB(255, 0, 255);
} colorTheme;

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;

    WNDCLASSEX wc;
    wc.cbSize = sizeof(wc);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "MainWindow";
    wc.cbWndExtra = NULL;
    wc.cbClsExtra = NULL;
    wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
    wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush(colorTheme.clientBackground);
    wc.hInstance = hInst;

    RegisterClassEx(&wc);

    HWND hMainWnd = CreateWindow(
        "MainWindow",
        "MainWindow",
        WS_OVERLAPPEDWINDOW,
        100, 100, 450, 120,
        (HWND)NULL, NULL, HINSTANCE(hInst), NULL);

    HMENU hMenu = CreateMenu();
    HMENU hMenuSub1 = CreatePopupMenu();
    HMENU hMenuSub2 = CreatePopupMenu();
    HMENU hMenuSub3 = CreatePopupMenu();
    AppendMenu(hMenu, MF_OWNERDRAW | MF_POPUP, (UINT)hMenuSub1, "SubMenu1");
    AppendMenu(hMenuSub1, MF_OWNERDRAW, 0, "Item01");
    AppendMenu(hMenuSub1, MF_OWNERDRAW, 0, "Item02");
    AppendMenu(hMenuSub1, MF_OWNERDRAW, 0, "Item03");
    AppendMenu(hMenuSub1, MF_OWNERDRAW, 0, "Item04");
    AppendMenu(hMenuSub1, MF_OWNERDRAW, 0, "Item05");
    AppendMenu(hMenu, MF_OWNERDRAW | MF_POPUP, (UINT)hMenuSub2, "SubMenu2");
    AppendMenu(hMenu, MF_OWNERDRAW | MF_POPUP, (UINT)hMenuSub3, "SubMenu3");
    
    MENUINFO menuInfo;
    menuInfo.cbSize = sizeof(menuInfo);
    menuInfo.fMask = MIM_BACKGROUND;
    menuInfo.hbrBack = CreateSolidBrush(colorTheme.pink);
    SetMenuInfo(hMenu, &menuInfo);
    SetMenu(hMainWnd, hMenu);

    ShowWindow(hMainWnd, nCmdShow);

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

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg) {
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hDC = BeginPaint(hWnd, &ps);

        HFONT hApplicationFont;
        LOGFONT applicationFont;
        applicationFont.lfHeight = 16;
        applicationFont.lfWidth = 6;
        applicationFont.lfEscapement = 0;
        applicationFont.lfOrientation = 0;
        applicationFont.lfWeight = FW_NORMAL;
        applicationFont.lfItalic = FALSE;
        applicationFont.lfUnderline = FALSE;
        applicationFont.lfStrikeOut = FALSE;
        applicationFont.lfCharSet = DEFAULT_CHARSET;
        applicationFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
        applicationFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
        applicationFont.lfQuality = ANTIALIASED_QUALITY;
        applicationFont.lfPitchAndFamily = DEFAULT_PITCH;
        strcpy_s(applicationFont.lfFaceName, "Arial");
        hApplicationFont = CreateFontIndirectA(&applicationFont);
        SelectObject(hDC, hApplicationFont);

        SelectObject(hDC, GetStockObject(DC_PEN));
        SetDCPenColor(hDC, colorTheme.clientBorder);
        SelectObject(hDC, GetStockObject(DC_BRUSH));
        SetDCBrushColor(hDC, colorTheme.clientBackground);
        RECT clientRect;
        GetClientRect(hWnd, &clientRect);
        Rectangle(hDC, 0, 0, clientRect.right, clientRect.bottom);

        EndPaint(hWnd, &ps);
        break;
    }
    case WM_MEASUREITEM:
    {
        LPMEASUREITEMSTRUCT itemStruct = (LPMEASUREITEMSTRUCT)lParam;
        const char* str = (const char*)(itemStruct->itemData);
        SIZE strSize;
        HDC hDC = GetDC(hWnd);          
        GetTextExtentPoint32(hDC, str, lstrlen(str), &strSize);
        itemStruct->itemWidth = strSize.cx;
        itemStruct->itemHeight = 30;
        ReleaseDC(hWnd, hDC);

        return TRUE;
        break;
    }
    case WM_DRAWITEM:
    {
        LPDRAWITEMSTRUCT itemStruct = (LPDRAWITEMSTRUCT)lParam;
        HDC hDC = itemStruct->hDC;
        SelectObject(hDC, GetStockObject(DC_PEN));
        SetDCPenColor(hDC, colorTheme.itemBorder);
        SelectObject(hDC, GetStockObject(DC_BRUSH));
        SetDCBrushColor(hDC, colorTheme.itemBackground);
        SetTextColor(hDC, colorTheme.text);
        SetBkMode(hDC, TRANSPARENT);

        Rectangle(hDC, itemStruct->rcItem.left,
                       itemStruct->rcItem.top,
                       itemStruct->rcItem.right,
                       itemStruct->rcItem.bottom + 1);
        DrawText(hDC, (const char*)(itemStruct->itemData), -1, &(itemStruct->rcItem), DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        break;
    }
    case WM_DESTROY:
    {
        PostQuitMessage(NULL);
        break;
    }
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return NULL;
}

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить цвет лед ленты
  • Как изменить цвет латуни
  • Как изменить цвет латекса
  • Как изменить цвет ластика фотошоп
  • Как изменить цвет лампы накаливания

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии