可視化操作建立的菜單,加載到視窗。
方法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工程,再建立“資源腳本”檔案。
建好後,插入“資源”-“菜單”-“建立”:
建好的菜單,和加速鍵,如圖:

儲存後,包含頭檔案 :resource.h
//主要CPP檔案代碼: