談到畫線,還有一個相關的函數
CreatePen( int iStyle, int cWidth, COLORREF color),今天就來瞧瞧這個函數。
第一個參數 int iStyle,他有幾種選項
PS_SOLID 筆是實心的。
PS_DASH 筆破折號了。此樣式僅在筆寬度以設備單位為單位的一或更少時才有效。
PS_DOT 筆是點綴的。此樣式僅在筆寬度以設備單位為單位的一或更少時才有效。
PS_DASHDOT 筆有交替的破折號和點。此樣式僅在筆寬度以設備單位為單位的一或更少時才有效。
PS_DASHDOTDOT 筆具有交替的破折號和雙點。此樣式僅在筆寬度以設備單位為單位的一或更少時才有效。
PS_NULL 筆是不可見的。
PS_INSIDEFRAME 筆是實心的。當此筆用於採用邊界矩形的任何 GDI 繪圖函數時,圖形的尺寸將收縮,以便它完全適合邊界矩形,同時考慮筆的寬度。這僅適用於幾何筆。
第二個參數 int cWidth,設定筆的寬度,以邏輯單位為單位。如果nWidth為零,則無論當前變換如何,筆都是單個像素寬的。另一方面,PS_DASH、PS_DOT、PS_DASHDOT、PS_DASHDOTDOT 必須設定為1才有效果,如果設定為大於1時則又會變成實心線。
第三個參數 COLORREF color,筆顏色的顏色參考。若要生成COLORREF結構,請使用RGB巨集,值的範圍在0~255之間。
最後,當您不再需要筆時,請呼叫DeleteObject函數將其刪除。
。,、'﹕︰﹔﹖﹑•!?!﹪%*﹡﹢ 我是可愛的分隔線 〈〉『』〖〗[]《》〔〕 「」【】﹁﹃︻﹂﹄︼
依慣例的,使用前要先宣告一下
HPEN hpen, hpen1;
我們先建立兩支畫筆來使用一下
hpen = CreatePen(PS_SOLID,2,RGB(0,0,0));
hpen1 = CreatePen(PS_DASH,1,RGB(0,0,0));
這樣才可以選筆 SelectObject(hdc,hpen);
再來畫線 MoveToEx(hdc,80,80,NULL);
LineTo(hdc,280,80);
你可以試著改變一下 iStyle、cWidth、COLORREF color 來看看他的變化。
。,、'﹕︰﹔﹖﹑•!?!﹪%*﹡﹢ 我是可愛的分隔線 〈〉『』〖〗[]《》〔〕 「」【】﹁﹃︻﹂﹄︼
main.cpp
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#define IDM_Demo1 1001
#define IDM_Line 1002
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
char szAppName[] = "HelloWin";
HWND hwnd ;
MSG msg ;
WNDCLASSEX wndclass ;
wndclass.cbSize = sizeof(WNDCLASSEX) ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = GetSysColorBrush(COLOR_3DFACE); //3DFACE);
wndclass.lpszMenuName = "DODO";
wndclass.lpszClassName = szAppName ;
wndclass.hIconSm = 0 ;
RegisterClassEx (&wndclass);
hwnd = CreateWindowEx (
0,
szAppName,
"Graph 繪製圖形",
WS_OVERLAPPEDWINDOW,
/*
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,*/
0,0,1100,600,
NULL,
NULL,
hInstance,
NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
PAINTSTRUCT ps; // 若改用這樣則不會閃爍 //*
HPEN hpen, hpen1;
switch (message)
{
HDC hdc;
case WM_PAINT:
hpen = CreatePen(PS_SOLID,2,RGB(0,0,0));
hpen1 = CreatePen(PS_DASH,1,RGB(0,0,0));
// hdc = GetDC(hwnd);
hdc = BeginPaint(hwnd,&ps); // 若改用這樣則不會閃爍 //*
SelectObject(hdc,hpen);
MoveToEx(hdc,80,80,NULL);
LineTo(hdc,280,80);
LineTo(hdc,280,250);
LineTo(hdc,80,250);
LineTo(hdc,80,80);
MoveToEx(hdc,120,80,NULL);
LineTo(hdc,120,100);
LineTo(hdc,80,100);
MoveToEx(hdc,80,300,NULL);
LineTo(hdc,280,300);
LineTo(hdc,280,410);
LineTo(hdc,80,410);
LineTo(hdc,80,300);
SelectObject(hdc,hpen1);
MoveToEx(hdc,120,300,NULL);
LineTo(hdc,120,380);
LineTo(hdc,80,380);
SelectObject(hdc,hpen);
MoveToEx(hdc,350,300,NULL);
LineTo(hdc,520,300);
LineTo(hdc,520,410);
LineTo(hdc,350,410);
LineTo(hdc,350,300);
SelectObject(hdc,hpen1);
MoveToEx(hdc,500,300,NULL);
LineTo(hdc,500,380);
LineTo(hdc,520,380);
SelectObject(hdc,hpen);
Arc(hdc,230,180,250,200,0,0,0,0);
SelectObject(hdc,hpen1);
MoveToEx(hdc,230,300,NULL);
LineTo(hdc,230,410);
MoveToEx(hdc,250,300,NULL);
LineTo(hdc,250,410);
MoveToEx(hdc,420,300,NULL);
LineTo(hdc,420,410);
MoveToEx(hdc,400,300,NULL);
LineTo(hdc,400,410);
// ReleaseDC(hwnd,hdc);
DeleteObject(hpen1);
DeleteObject(hpen);
EndPaint(hwnd,&ps); // 若改用這樣則不會閃爍 //*
return 0;
case WM_CREATE:
return 0 ;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_Demo1:
break;
case IDM_Line:
{
hdc = GetDC(hwnd);
MoveToEx(hdc,20,20,NULL);
LineTo(hdc,250,20);
LineTo(hdc,50,310);
LineTo(hdc,310,310);
ReleaseDC(hwnd,hdc);
}
break;
}
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
你也可以畫一畫你所想像的圖形喔....
延伸閱讀