談到畫線,還有一個相關的函數
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) ;
}

 

 

 

812.bmp

 


你也可以畫一畫你所想像的圖形喔....

 

 

 

 

 

 

 

延伸閱讀

 

[伊蒙 dev c++] 視窗程式學習筆記

 

[做中學 dev c++] dev c++

 

 

 

 

 

 

 

arrow
arrow

    伊蒙‧普羅客 發表在 痞客邦 留言(0) 人氣()