Visual C 程式設計技巧之一和二

2021-06-22 07:53:03 字數 4478 閱讀 6698



1. 如何獲取應用程式的例項控制代碼?

2. 如何通過**獲得應用程式主視窗的指標?

3.如何在程式中獲得其他程式的圖示?

4.如何程式設計結束應用程式?如何程式設計控制windows的重新引導?

5.怎樣加栽其他的應用程式?

6. 確定應用程式的 路徑

7. 獲得各種目錄資訊

8. 如何自定義訊息

9. 如何改變視窗的圖示?

10. 如何改變視窗的預設風格?

11. 如何將視窗居中顯示?

12. 如何讓視窗和 mdi視窗一啟動就最大化和最小化?

13. 如何使程式保持極小狀態?

14. 如何限制視窗的大小?

15. 如何使視窗不可見?

16. 如何使視窗始終在最前方?  

13.如何在程式中獲得其他程式的 圖示? 

兩種方法: 

(1) sdk函式 shgetfileinfo 或使用 extracticon獲得圖示資源的 handle, 

(2) sdk函式 shgetfileinfo獲得有關檔案的 很多資訊,如大小圖示,屬性,型別等. 

example(1): 在程式視窗左上角顯示 notepad圖示. 

void csampleview::ondraw(cdc * pdc) 

}

example(2):同樣功能,use extracticon function 

void csampleview::ondraw(cdc *pdc) 

說明: 獲得notepad.exe的路徑正規上來說用getwindowsdirectory 函式得到,如果是呼叫 win95下的畫筆,應該用訪問登錄檔的方法獲得其路徑,要作成乙個比較考究的程式,考慮應該全面點. 

4.如何程式設計結束應用程式?如何程式設計控制windows的重新引導? 

這是個很簡單又是程式設計中經常要遇到的問題.第一問,向視窗傳送 wm_close訊息,呼叫 cwnd::onclose成員函式.允許對使用者提示 

是否儲存修改過的資料. 

example: afxgetmainwindow()->sendmessage(wm_close); 

還可以建立乙個自定義的函式 terminate window 

void terminate window(lpcstr pcaption) 

說明: findwindow函式不是提倡的做法,因為它無法處理標題欄自動改變,比如我們要檢測 notepad是不是已執行而事先不知道notepad的標題欄,這時 findwindow就無能為力了,可以通過列舉 windows任務列表的辦法來實現。 在 機械出版社"windows 95 api開發人員指南"一書有比較詳細的介紹,這裡就不再多說樂。 

第二問,use exitwindow*** function函式控制系統是重新引導,還是重啟 windows.前面已經有人講過樂,就不再提了。 

5.怎樣加栽其他的應用程式? 

我記得這好象是出場頻度很高的問題。三個sdk函式 winexec, shellexecute,createprocess可以使用。 

winexec最簡單,兩個引數,前乙個指定路徑,後乙個指定顯示方式.後乙個引數值得說一下,比如泥用 sw_showmaxmized方式去加栽乙個無最大化按鈕的 程式,呵呵就是neterm,calc等等,就不會出現正常的 窗體,但是已經被加到任務列表裡了。shellexecute較 winexex靈活一點,可以指定工作目錄,下面的 example就是直接開啟 c:/temp/1.txt,而不用加栽與 txt檔案關聯的應用程式,很多安裝程式完成後都會開啟乙個視窗,來顯示readme or faq,偶猜就是這麼作的啦. 

shellexecute(null,null,_t("1.txt"),null,_t("c://temp"),sw_showmaxmized); 

createprocess最複雜,一共有十個引數,不過大部分都可以用null代替,它可以指定程序的安全屬性,繼承資訊,類的優先順序等等.來看個很簡單的 example: 

startupinfo stinfo; //啟動視窗的資訊 

processinfo procinfo; //程序的資訊

createprocess(null,_t("notepad.exe"),null,null.false, normal_priority_class,null,null, &stinfo,&procinfo);

6. 確定應用程式的 路徑 

前些天好象有人問過這個問題. 

use getmodulefilename 獲得應用程式的路徑,然後去掉可執行檔名。 

example: 

tchar exefullpath[max_path]; // max_path在api中定義了吧,好象是128 

getmodulefilename(null,exefullpath,max_path)

7. 獲得各種目錄資訊  

windows目錄: use 

"getwindowsdirectory「 

windows下的system目錄: use 

"getsystemdirectory"

temp目錄: use 

"gettemppath "

當前目錄: use 

"getcurrentdirectory"

請注意前兩個函式的第乙個引數為 目錄變數名,後乙個為緩衝區; 後兩個相反. 

8. 如何自定義訊息 

也有人問過的,其實不難。 

(1) 手工定義訊息,可以這麼寫 

#define wm_my_message(wm_user+

100), 

ms 推薦的至少是 wm_user+

100; 

(2)寫訊息處理函式,用 wparam,lparam返回lresult. 

lresult cmainframe::onmymessage(wparam wparam,lparam lparam)  (

3) 在類的 afx_msg處進行宣告,也就是常說的

"巨集對映"

9. 如何改變視窗的圖示?  

向視窗傳送 wm_section訊息。  

example:  

assert(hicon);

afxgetmainwnd() ->sendmessage(wm_section,true,(lparam) hicon);

10. 如何改變視窗的預設風格?  

重栽 cwnd:: precreatewindow 並修改createstruct結構來指定視窗風格和其他建立資訊.  

example: delete "max" button and set original window's position and size  

bool cmainframe:: precreatewindow (createstruct &cs)  

11. 如何將視窗居中顯示?  

easy, call function cwnd:: center windows  

example(1): center window( ); //relative to it's parent  

// relative to screen  

afxgetmainwnd( ) -> center window( );  

12. 如何讓視窗和 mdi視窗一啟動就最大化和最小化?  

先說視窗。在 initstance 函式中設定 m_ncmdshow的 取值.  

m_ncmdshow=sw_showmaxmized ; //最大化  

m_ncmdshow=sw_showminmized ; //最小化

m_ncmdshow=sw_shownormal ; //正常方式

bool cmainframe:: onqueryopen( )  

14. 如何限制視窗的大小? 

也就是 fixeddialog形式。 windows 傳送 wm_getmaxmininfo訊息來跟蹤,響應它,在 ongetmaxmininfo 中寫**:  

15. 如何使視窗不可見?  

很簡單,用sw_hide 隱藏視窗,可以結合 findwindow,showwindow 控制.  

16. 如何使視窗始終在最前方?  

兩種途徑.  

bringwindowtotop(handle);  

setwindowpos函式,指定視窗的 最頂風格,用ws_ex_topmost擴充套件視窗的 風格  

example:  

void toggletopmost( cwnd *pwnd)  

Visual C 程式設計技巧之一

visual c 程式設計技巧之一 1.如何獲取應用程式的例項控制代碼?2.如何通過 獲得應用程式主視窗的指標?3.如何在程式中獲得其他程式的 圖示?4.如何程式設計結束應用程式 如何程式設計控制 windows 的重新引導?5.怎樣加栽其他的應用程式?6.確定應用程式的 路徑 7.獲得各種目錄資訊...

Visual C 程式設計技巧之二

9.如何改變視窗的圖示?向視窗傳送wm section訊息。example assert hicon afxgetmainwnd sendmessage wm section,true,lparam hicon 10.如何改變視窗的預設風格?重栽cwnd precreatewindow並修改crea...

Visual C 程式設計技巧之五和六

33 如何獲取乙個對話控制項的指標 34 如何禁止和使能控制項 35 如何改變控制項的字型 36 如何在ole控制項中使用ole color資料型別 37 在不使用通用檔案開啟對話的情況下如何顯示乙個檔案列表 38 為什麼旋轉按鈕控制項看起來倒轉 39 為什麼旋轉按鈕控制項不能自動地更新它下面的編輯...