天天看點

C++windows核心程式設計筆記day07_day08,可視化建菜單、加速鍵使用、繪圖等

可視化操作建立的菜單,加載到視窗。

方法1:注冊時指定菜單

wce.lpszMenuName=MAKEINTRESOURCE(IDR_MENUMAIN);//數字形式的資源ID轉換為字元串形式的資源

方法2:

//建立視窗時加載菜單資源

HMENU menumain= LoadMenu(g_hinstance,MAKEINTRESOURCE(IDR_MENUMAIN));

menumain 傳入 CreateWindowEx();//倒數第三個參數

視窗指定小圖示:

1、注冊時指定

wce.hIconSm=LoadIcon(g_hinstance,MAKEINTRESOURCE(IDI_ICON1));

2、調用發消息函數,修改圖示

SendMessage(

  (HWND) hWnd,      // handle to destination window

  WM_SETICON,

  (WPARAM) wParam, // icontype(ICON_BIG/ICON_SMALL)

  (LPARAM) lParam  // LoadIcon()的傳回值

);

畫ICON圖檔到視窗:

HICON ico=LoadIcon(g_hinstance,MAKEINTRESOURCE(IDI_ICON1));

DrawIcon(hdc,100,100,ico);

修改光标:

1、wce.hCursor=LoadCursor(g_hinstance,MAKEINTRESOURCE(IDC_CUR_ARROW));//靜态光标

2、動态設定光标

在滑鼠移動中,會産生mousemove和WM_SETSURSOR。

case WM_SETCURSOR:

OnSetCursor(hwnd,wparam,lparam);

break;

//傳回值,舊的光标:

HCURSOR SetCursor( HCURSOR hCursor   // handle to cursor

void OnSetCursor(HWND hwnd,WPARAM wparam,LPARAM lparam)

{//HCURSOR最好作為全局變量,資源隻調用一次,wm_create中

UINT hit=LOWORD(lparam);

HCURSOR c1=NULL;

if(hit==HTCLIENT)//光标在客戶區

{

POINT pt={0};

RECT rc={0};

GetCursorPos(&pt);

GetClientRect(hwnd,&rc);

/*

char txt[200]={0};

ScreenToClient(hwnd,&pt);

sprintf(txt,"%d,%d ; %d,%d,%d,%d\n",pt.x,pt.y,rc.top,rc.left,rc.right,rc.bottom);

WriteConsole(g_houtput,txt,strlen(txt),NULL,NULL);

*/

if(pt.x>=rc.right/2)//客戶區域前半部分與後半部分滑鼠圖示設定為不同

//c1=LoadCursor(g_hinstance,MAKEINTRESOURCE(IDC_CUR_INPUT));

c1=LoadCursorFromFile("beam_rm.cur");//從檔案加載

//c1=LoadCursorFromFile("aero_working.ani");//動态光标

}

else

c1=LoadCursor(g_hinstance,MAKEINTRESOURCE(IDC_CUR_ARROW));

if(c1!=NULL) SetCursor(c1);

//成功傳回字元長度,失敗傳回0

int LoadString(  HINSTANCE hInstance,

  UINT uID,             // resource identifier

  LPTSTR lpBuffer,      // 接收的字元串

  int nBufferMax        // 允許的最大長度

  );

//讀取字元串資源表中的字元

char title[30]={0};

LoadString(g_hinstance,IDS_WND,title,sizeof(title));

程式版本資源:

插入"version"資源,然後修改裡面的資訊就行了。

加速鍵(程式中的快捷鍵)

HACCEL LoadAccelerators(  HINSTANCE hInstance,

  LPCTSTR lpTableName   // accelerator table name

int TranslateAccelerator(  HWND hWnd,

  HACCEL hAccTable,  // handle to accelerator table

  LPMSG lpMsg        // message information

//使用,把加速鍵轉化為點選事件,加速鍵的ID和按鈕ID相同,就綁定在一起(執行同一個case中的事件)。

MSG msg={0};

HACCEL acc= LoadAccelerators( g_hinstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));

while(GetMessage(&msg,NULL,0,0)){

if(!TranslateAccelerator(msg.hwnd,acc,&msg))//不是加速鍵

TranslateMessage(&msg);//翻譯消息

DispatchMessage(&msg);//派發給 WinProc 處理消息

菜單的熱鍵:

在後面加如:(&F),那麼按alt+F就能達到和點選一樣的效果。

//繪圖相關,畫各種基本圖形

void OnPaint(HWND hwnd)

PAINTSTRUCT ps={0};

HDC hdc=BeginPaint(hwnd,&ps);

switch(g_id)

//SetPixel(hdc,100,100,RGB(0,0,255));//畫點

case ID_drawline://畫線

MoveToEx(hdc,100,100,NULL);

LineTo(hdc,100,150);

LineTo(hdc,150,150);

case ID_drawellipse://畫圓

Ellipse(hdc,100,100,200,200);

RoundRect(hdc,300,100,500,300,200,200);

case ID_drawrect://畫距形

Rectangle(hdc,100,100,200,200);

RoundRect(hdc,300,100,500,300,0,0);

case ID_drawarc://畫弧形

SetArcDirection(hdc,AD_CLOCKWISE);//AD_CLOCKWISE/AD_COUNTERCLOCKWISE 順時針或逆時針

Arc(hdc,100,100,300,300,100,100,300,300);

case ID_drawwithpen://使用畫筆

drawwithpen(hdc);

EndPaint(hwnd,&ps);

建立畫筆:

HPEN CreatePen(  int fnPenStyle,// pen style

  int nWidth,// pen width

  COLORREF crColor   // pen color

//把畫筆設定到繪圖對象,傳回預設的畫筆,先設定,使用完後,再設定回原來的

HGDIOBJ SelectObject(  HDC hdc,          // handle to DC

  HGDIOBJ hgdiobj   // handle to object

//删除畫筆對象

BOOL DeleteObject(  HGDIOBJ hObject   // handle to graphic object

//使用畫筆流程示例代碼:

HPEN pen=CreatePen(PS_DOT,1,RGB(0,255,0));

HGDIOBJ oldpen= SelectObject(hdc,pen);

//畫圖操作

SelectObject(hdc,oldpen);

DeleteObject(pen);

//畫刷的作用,填充封閉圖形的空白部分.

//建立實心畫刷-單顔色

HBRUSH CreateSolidBrush(  COLORREF crColor   // brush color value

//建立陰影畫刷-陰影線

HBRUSH CreateHatchBrush(  int fnStyle,      // hatch style

  COLORREF clrref   // foreground color

//建立位圖畫刷,填充圖檔

HBRUSH CreatePatternBrush(  HBITMAP hbmp   // handle to bitmap);

其使用方法與CreatePen一樣。

//擷取系統GDI對象,用後不需要删除

HGDIOBJ GetStockObject(int fnObject   // stock object type

如:HGDIOBJ brush=GetStockObject(NULL_BRUSH);//透明畫刷

day71 am over

//位圖相關

光栅圖形-記錄圖像中每一點的顔色等資訊

矢量圖形-高妙圖像算法/繪圖指令等資訊

位圖在視窗中成像:BitBlt(…);

縮放成像:StretchBlt(……);

void drawbitmap(HDC hdc)

HBITMAP bitmap=LoadBitmap(g_hinstance,MAKEINTRESOURCE(IDB_BITMAP2));

HDC memdc=CreateCompatibleDC(hdc);//記憶體DC

HGDIOBJ oldbmp= SelectObject(memdc,bitmap);//送位圖到記憶體dc

//MoveToEx(memdc,100,100,NULL);

//LineTo(memdc,130,150);

BITMAP bm={0};//位圖資訊

GetObject(bitmap,sizeof(bm),&bm);//擷取位圖資訊。

BitBlt(hdc,0,0,bm.bmWidth,bm.bmHeight,memdc,0,0,SRCCOPY);//在視窗中成像(顯示)

StretchBlt(hdc,100,300,69,51,memdc,0,0,138,102,SRCCOPY);//縮小顯示

StretchBlt(hdc,100,400,276,204,memdc,0,0,138,102,SRCCOPY);//放大顯示

//NOTSRCCOPY 反色/SRCCOPY 原圖顔色

SelectObject(memdc,oldbmp);//還原預設

DeleteObject(bitmap);//删除位圖

DeleteObject(memdc);//删除記憶體dc

坐标系:分為裝置坐标系和邏輯坐标系。

在GDI繪圖中,使用的是邏輯坐标系;邏輯坐标系與裝置坐标系有個轉換關系,可以設定。

//設定映射模式(邏輯機關與裝置機關之間的關系)

int SetMapMode(  HDC hdc,        // handle to device context

  int fnMapMode   // new mapping mode

fnMapMode:

MM_TEXT (預設)1邏輯=1px(像素) ---坐标:x右為正,y下為正

MM_TWIPS  一般為列印機:1邏輯=1/1440英寸 ---x右為正。y上為正(下面4種模式也是這種)

MM_HIENGLISH

MM_LOENGLISH

MM_HIMETRIC

MM_LOMETRIC

MM_ISOTROPIC    自定義模式  1個邏輯=自定義

MM_ANISOTROPIC  自定義模式  X軸1個邏輯=自定義1,y軸1個邏輯=自定義2

//自定義模式時,設定邏輯與裝置的比例,下面兩個函數同時使用

BOOL SetWindowExtEx(  HDC hdc,

  int nXExtent,  //邏輯的X比例

  int nYExtent,  //邏輯的Y比例

  LPSIZE lpSize  //舊的比例

BOOL SetViewportExtEx(  HDC hdc,

  int nXExtent,  //裝置的X比例

  int nYExtent,  //裝置的Y比例

//使用步驟

int oldmm=SetMapMode(hdc,MM_TWIPS);

//……繪圖操作……

SetMapMode(hdc,oldmm);

//畫字元串,比TextOut強大

int DrawText(  HDC hDC,          // handle to DC

  LPCTSTR lpString, // text to draw  int nCount,       // text length

  LPRECT lpRect,    // formatting dimensions

  UINT uFormat      // text-drawing options

uFormat 常用選項:

DT_LEFT|DT_TOP|DT_WORDBREAK|DT_NOCLIP|DT_NOPREFIX

或DT_SINGLELINE|DT_VCENTER|DT_BOTTOM|DT_NOPREFIX|……

//TextOut 加強版,一般不用。

BOOL ExtTextOut(  HDC hdc,          // handle to DC

  int X,            // x-coordinate of reference point

  int Y,            // y-coordinate of reference point

  UINT fuOptions,   // 可為0

  CONST RECT* lprc, // 可為NULL

  LPCTSTR lpString, // 字元串

  UINT cbCount,     // 字元串長度

  CONST INT* lpDx   // 字元間距數組(漢字按兩個字元算,之間間距用0代替)

步驟:

建立win32 Application工程,再建立“資源腳本”檔案。

建好後,插入“資源”-“菜單”-“建立”:

建好的菜單,和加速鍵,如圖:

C++windows核心程式設計筆記day07_day08,可視化建菜單、加速鍵使用、繪圖等
C++windows核心程式設計筆記day07_day08,可視化建菜單、加速鍵使用、繪圖等

儲存後,包含頭檔案 :resource.h

//主要CPP檔案代碼:

繼續閱讀