主視窗指標儲存於 CWinThread::m_pMainWnd,透過全域函式存取:
AfxGetMainWnd()->ShowWindow(SW_SHOWMAXIMIZED); // 最大化主視窗
使用 GetModuleFileName 取得含檔名的完整路徑,再移除檔名部分:
TCHAR szExePath[MAX_PATH];
GetModuleFileName(NULL, szExePath, MAX_PATH);
// 配合 PathRemoveFileSpec 或手動截斷取得目錄
兩種常用方法:
SHGetFileInfo:可同時取得大/小圖示、檔案屬性、類型描述。ExtractIcon:直接從可執行檔/圖示檔提取指定索引圖示。// 範例:在視窗左上角繪製 Notepad 圖示
SHFILEINFO sfi;
if (SHGetFileInfo(_T("notepad.exe"), 0, &sfi, sizeof(sfi), SHGFI_ICON)) {
pDC->DrawIcon(10, 10, sfi.hIcon);
DestroyIcon(sfi.hIcon); // 釋放圖示控制代碼
}
提示:系統路徑應用 GetWindowsDirectory、GetSystemDirectory 取得,避免硬編碼。
| 目錄 | API | 參數順序注意 |
|---|---|---|
| Windows 目錄 | GetWindowsDirectory | 緩衝區指標在前,長度在後 |
| System 目錄 | GetSystemDirectory | 同上 |
| 暫存目錄 | GetTempPath | 長度在前,緩衝區在後 |
| 目前工作目錄 | GetCurrentDirectory | 長度在前,緩衝區在後 |
#define WM_MY_MESSAGE (WM_USER + 100)(建議 ≥ WM_USER+100 避免衝突)。LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam)。ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)。發送 WM_SETICON 訊息(原文誤寫為 WM_SECTION):
HICON hIcon = AfxGetApp()->LoadIcon(IDI_MYICON);
ASSERT(hIcon);
AfxGetMainWnd()->SendMessage(WM_SETICON, TRUE, (LPARAM)hIcon); // 大圖示
AfxGetMainWnd()->SendMessage(WM_SETICON, FALSE, (LPARAM)hIcon); // 小圖示
覆寫 PreCreateWindow,調整 CREATESTRUCT:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
cs.style &= ~WS_MAXIMIZEBOX; // 移除最大化按鈕
cs.x = cs.y = 0; // 位置
cs.cx = GetSystemMetrics(SM_CXSCREEN)/2; // 寬度螢幕一半
cs.cy = GetSystemMetrics(SM_CYSCREEN)/2; // 高度螢幕一半
return CMDIFrameWnd::PreCreateWindow(cs);
}