使用 SetDCBrushColor 設定裝置內容的預設畫刷顏色,但必須先將 DC_BRUSH 選入 DC:
SelectObject(hdc, GetStockObject(DC_BRUSH));
SetDCBrushColor(hdc, RGB(0, 0, 255)); // 藍色
Rectangle(hdc, 20, 18, 68, 50);
每次呼叫 SetDCBrushColor 即改變後續繪圖的填充顏色。

WM_PAINT 重繪所有已儲存的線段std::vector 儲存每條線的起點、終點、線型case WM_CREATE: {
HMENU menubar = CreateMenu();
HMENU menuPop = CreatePopupMenu();
AppendMenu(menuPop, MF_STRING, (UINT_PTR)PS_SOLID, L"實線");
AppendMenu(menuPop, MF_STRING, (UINT_PTR)PS_DASH, L"虛線");
AppendMenu(menuPop, MF_STRING, (UINT_PTR)PS_DOT, L"點線");
AppendMenu(menuPop, MF_STRING, (UINT_PTR)PS_DASHDOT, L"點虛線");
AppendMenu(menubar, MF_STRING|MF_POPUP, (UINT_PTR)menuPop, L"選擇線型");
SetMenu(hwnd, menubar);
} return 0;
選單 ID 直接對應 CreatePen 的線型常數,簡化程式碼。
case WM_COMMAND: {
HMENU mnbar = GetMenu(hwnd);
HMENU hmnPop = GetSubMenu(mnbar, 0);
CheckMenuRadioItem(hmnPop, PS_SOLID, PS_DASHDOT, LOWORD(wParam), MF_BYCOMMAND);
penStyle = (int)LOWORD(wParam); // 記錄使用者選擇
} return 0;
case WM_LBUTTONDOWN: {
pCurrentData = new PAINTDATA;
pCurrentData->penStyle = penStyle;
pCurrentData->ptBeginX = GET_X_LPARAM(lParam);
pCurrentData->ptBeginY = GET_Y_LPARAM(lParam);
} return 0;
case WM_LBUTTONUP: {
if (pCurrentData) {
pCurrentData->ptEndX = GET_X_LPARAM(lParam);
pCurrentData->ptEndY = GET_Y_LPARAM(lParam);
// 即時繪製
HDC hdc = GetDC(hwnd);
HPEN pen = CreatePen(pCurrentData->penStyle, 1, RGB(0,255,0));
HPEN oldpen = (HPEN)SelectObject(hdc, pen);
MoveToEx(hdc, pCurrentData->ptBeginX, pCurrentData->ptBeginY, NULL);
LineTo(hdc, pCurrentData->ptEndX, pCurrentData->ptEndY);
SelectObject(hdc, oldpen);
DeleteObject(pen);
ReleaseDC(hwnd, hdc);
datas.push_back(*pCurrentData);
}
} return 0;
case WM_PAINT: {
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
for (auto& item : datas) {
HPEN pen = CreatePen(item.penStyle, 1, RGB(0,255,0));
SelectObject(ps.hdc, pen);
MoveToEx(ps.hdc, item.ptBeginX, item.ptBeginY, NULL);
LineTo(ps.hdc, item.ptEndX, item.ptEndY);
DeleteObject(pen);
}
EndPaint(hwnd, &ps);
} return 0;



#include <Windows.h>
#include <WindowsX.h>
#include <vector>
using namespace std;
typedef struct tagData {
int ptBeginX, ptBeginY;
int ptEndX, ptEndY;
int penStyle;
} PAINTDATA;
LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpsCmd, int nShow) {
WNDCLASS wc = {};
wc.hbrBackground = CreateSolidBrush(RGB(0,0,0));
wc.hInstance = hThisApp;
wc.lpfnWndProc = WindowProc;
wc.lpszClassName = L"My";
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wc);
HWND hwnd = CreateWindow(L"My", L"應用程式", WS_OVERLAPPEDWINDOW,
50, 20, 600, 480, NULL, NULL, hThisApp, NULL);
if (hwnd == NULL) return -1;
ShowWindow(hwnd, nShow);
UpdateWindow(hwnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
static vector<PAINTDATA> datas;
static int penStyle = PS_SOLID;
static PAINTDATA* pCurrentData = nullptr;
switch (msg) {
case WM_CREATE: {
HMENU menubar = CreateMenu();
HMENU menuPop = CreatePopupMenu();
AppendMenu(menuPop, MF_STRING, (UINT_PTR)PS_SOLID, L"實線");
AppendMenu(menuPop, MF_STRING, (UINT_PTR)PS_DASH, L"虛線");
AppendMenu(menuPop, MF_STRING, (UINT_PTR)PS_DOT, L"點線");
AppendMenu(menuPop, MF_STRING, (UINT_PTR)PS_DASHDOT, L"點虛線");
AppendMenu(menubar, MF_STRING|MF_POPUP, (UINT_PTR)menuPop, L"選擇線型");
SetMenu(hwnd, menubar);
} return 0;
case WM_COMMAND: {
HMENU mnbar = GetMenu(hwnd);
HMENU hmnPop = GetSubMenu(mnbar, 0);
CheckMenuRadioItem(hmnPop, PS_SOLID, PS_DASHDOT, LOWORD(wParam), MF_BYCOMMAND);
penStyle = (int)LOWORD(wParam);
} return 0;
case WM_LBUTTONDOWN: {
pCurrentData = new PAINTDATA;
pCurrentData->penStyle = penStyle;
pCurrentData->ptBeginX = GET_X_LPARAM(lParam);
pCurrentData->ptBeginY = GET_Y_LPARAM(lParam);
} return 0;
case WM_LBUTTONUP: {
if (pCurrentData) {
pCurrentData->ptEndX = GET_X_LPARAM(lParam);
pCurrentData->ptEndY = GET_Y_LPARAM(lParam);
HDC hdc = GetDC(hwnd);
HPEN pen = CreatePen(pCurrentData->penStyle, 1, RGB(0,255,0));
HPEN oldpen = (HPEN)SelectObject(hdc, pen);
MoveToEx(hdc, pCurrentData->ptBeginX, pCurrentData->ptBeginY, NULL);
LineTo(hdc, pCurrentData->ptEndX, pCurrentData->ptEndY);
SelectObject(hdc, oldpen);
DeleteObject(pen);
ReleaseDC(hwnd, hdc);
datas.push_back(*pCurrentData);
}
} return 0;
case WM_PAINT: {
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
for (auto& item : datas) {
HPEN pen = CreatePen(item.penStyle, 1, RGB(0,255,0));
SelectObject(ps.hdc, pen);
MoveToEx(ps.hdc, item.ptBeginX, item.ptBeginY, NULL);
LineTo(ps.hdc, item.ptEndX, item.ptEndY);
DeleteObject(pen);
}
EndPaint(hwnd, &ps);
} return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
DC_BRUSH + SetDCBrushColor 快速變更填充顏色PS_* 常數,簡化畫筆建立邏輯static 變數延長生命週期至程式結束DeleteObject 釋放