精品国产亚洲一区二区三区,男女作爱在线观看免费网站,欧美的又大又长做禁片A片,97国产精品人妻无码久久久

  • 相關軟件
    >Visual C++編程技巧之一 創(chuàng)建者:webmaster 更新時間:2005-07-02 01:23

    1. 如何獲取應用程序的實例句柄?


    應用程序的 實例句柄保存在CWinAppIm_hInstance ,可以這么調用


    AfxGetInstancdHandle獲得句柄.


    Example: HANDLE hInstance=AfxGetInstanceHandle();


    2. 如何通過代碼獲得應用程序主窗口的指針?


    主窗口的 指針保存在CWinThread::m_pMainWnd,調用 AfxGetMainWnd實現。


    AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //使程序最大化.


    3.如何在程序中獲得其他程序的 圖標?


    兩種方法:


    (1) SDK函數 SHGetFileInfo 或使用 ExtractIcon獲得圖標資源的 handle,


    (2) SDK函數 SHGetFileInfo獲得有關文件的 很多信息,如大小圖標,屬性,類型等.


    Example(1): 在程序窗口左上角顯示 NotePad圖標.


    void CSampleView: OnDraw(CDC * pDC)


    {


    if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,


    &stFileInfo,sizeof(stFileInfo),SHGFI_ICON))


    {


    pDC ->DrawIcon(10,10,stFileInfo.hIcon);


    }


    }


    Example(2):同樣功能,Use ExtractIcon Function


    void CSampleView:: OnDraw(CDC *pDC)


    {


    HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T


    ("NotePad.exe"),0);


    if (hIcon &&hIcon!=(HICON)-1)


    pDC->DrawIcon(10,10,hIcon);


    }


    說明: 獲得notepad.exe的路徑正規(guī)上來說用GetWindowsDirectory 函數得到,如果是調用 win95下的畫筆,應該用訪問注冊表的方法獲得其路徑,要作成一個比較考究的程序,考慮應該全面點.


    4.如何編程結束應用程序?如何編程控制windows的重新引導?


    這是個很簡單又是編程中經常要遇到的問題.


    第一問,向窗口發(fā)送 WM_CLOSE消息,調用 CWnd::OnClose成員函數.允許對用戶提示


    是否保存修改過的數據.


    Example: AfxGetMainWindow()->SendMessage(WM_CLOSE);


    還可以創(chuàng)建一個自定義的函數 Terminate Window


    void Terminate Window(LPCSTR pCaption)


    {


    CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption);


    if (pWnd)


    pWnd ->SendMessage(WM_CLOSE);


    }


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


    第二問,Use ExitWindowsEx Function函數控制系統(tǒng)是重新引導,還是重啟 windows.前面已經有人講過樂,就不再提了。


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


    我記得這好象是出場頻度很高的問題。


    三個SDK函數 winexec, shellexecute,createprocess可以使用。


    WinExec最簡單,兩個參數,前一個指定路徑,后一個指定顯示方式.后一個參數值得說一下,比如泥用 SW_SHOWMAXMIZED方式去加栽一個無最大化按鈕的程序,呵呵就是Neterm,calc等等,就不會出現正常的窗體,但是已經被加到任務列表里了。ShellExecuteWinExex靈活一點,可以指定工作目錄,下面的 Example就是直接打開 c:\temp\1.txt,而不用加栽與 txt文件關聯的應用程序,很多安裝程序完成后都會打開一個窗口,來顯示Readme or Faq,偶猜就是這么作的啦.


    ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:\\temp"),SW_SHOWMAXMIZED);


    CreateProcess最復雜,一共有十個參數,不過大部分都可以用NULL代替,它可以指定進程的安全屬性,繼承信息,類的優(yōu)先級等等.來看個很簡單的 Example:


    STARTUPINFO stinfo; //啟動窗口的信息


    PROCESSINFO procinfo; //進程的信息


    CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE, NORMAL_PRIORITY_


    CLASS,NULL,NULL, &stinfo,&procinfo);


    6. 確定應用程序的 路徑


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


    Use GetModuleFileName 獲得應用程序的路徑,然后去掉可執(zhí)行文件名。


    Example:


    TCHAR exeFullPath[MAX_PATH]; // MAX_PATHAPI中定義了吧,好象是128


    GetModuleFileName(NULL,exeFullPath,MAX_PATH)


    7. 獲得各種目錄信息


    Windows目錄: Use "GetWindowsDirectory


    Windows下的system目錄: Use "GetSystemDirectory"


    temp目錄: Use "GetTempPath "


    當前目錄: Use "GetCurrentDirectory"


    請注意前兩個函數的第一個參數為目錄變量名,后一個為緩沖區(qū); 后兩個相反.


    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. 如何改變窗口的圖標?


    向窗口發(fā)送 WM_SECTION消息。


    Example:


    HICON hIcon=AfxGetApp() ->LoadIcon(IDI_ICON);


    ASSERT(hIcon);


    AfxGetMainWnd() ->SendMessage(WM_SECTION,TRUE,(LPARAM) hIcon);


    10. 如何改變窗口的缺省風格?


    重栽 CWnd:: PreCreateWindow 并修改CREATESTRUCT結構來指定窗口風格和其他


    創(chuàng)建信息.


    Example: Delete "Max" Button and Set Original Window's Position and Size


    BOOL CMainFrame:: PreCreateWindow (CREATESTRUCT &cs)


    {


    cs.style &=~WS_MAXINIZEMOX;


    cs.x=cs.y=0;


    cs.cx=GetSystemMetrics(SM_CXSCREEN/2);


    cs.cy=GetSystemMetrics(SM_CYSCREEN/2);


    return CMDIFramewnd ::PreCreateWindow(cs);


    }


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


    Easy, Call Function CWnd:: Center Windows


    Example(1): Center Window( ); //Relative to it's parent


    // Relative to Screen


    Example(2): Center Window(CWnd:: GetDesktopWindow( ));


    //Relative to Application's MainWindow


    AfxGetMainWnd( ) -> Center Window( );


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


    先說窗口。


    InitStance 函數中設定 m_nCmdShow的 取值.


    m_nCmdShow=SW_SHOWMAXMIZED ; //最大化


    m_nCmdShow=SW_SHOWMINMIZED ; //最小化


    m_nCmdShow=SW_SHOWNORMAL ; //正常方式


    MDI窗口:


    如果是創(chuàng)建新的應用程序,可以用 MFC AppWizard Advanced 按鈕并在


    MDI子窗口風格組中檢測最大化或最小化; 還可以重載 MDI Window


    PreCreateWindow函數,設置WS_MAXMIZE or WS_MINMIZE;


    如果從 CMDIChildWnd 派生,調用 OnInitialUpdate函數中的 CWnd::Show


    Window來指定 MDI Child Window的 風格。


    13. 如何使程序保持極小狀態(tài)?


    很有意思的 問題


    這么辦: 在恢復程序窗體大小時, Windows會發(fā)送WM_QUERY-OPEN消息,


    ClassWizard設置成員函數 OnQueryOpen() ,add following code:


    Bool CMainFrame:: OnQueryOpen( )


    {


    Return false;


    }


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


    也就是 FixedDialog形式。 Windows 發(fā)送 WM_GETMAXMININFO消息來跟蹤,


    響應它,OnGetMAXMININFO 中寫代碼:


    15. 如何使窗口不可見?


    很簡單,SW_HIDE 隱藏窗口,可以結合 FindWindow,ShowWindow 控制.


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


    兩種途徑.


    BringWindowToTop(Handle);


    SetWindowPos函數,指定窗口的最頂風格,WS_EX_TOPMOST擴展窗口的風格


    Example:


    void ToggleTopMost( CWnd *pWnd)


    {


    ASSERT_VALID(pWnd);


    pWnd ->SetWindowPos(pWnd-> GetStyle( ) &WS_EX_TOPMOST)?


    &wndNoTopMOST: &wndTopMost,0,0,0,0,SSP_NOSIZE|WSP_NOMOVE);


    }


     


    17、如何創(chuàng)建一個字回繞的CEditView


    重載CWnd : : PreCreateWindow和修改CREATESTRUCT結構,關閉CEditView對象的ES_AUTOHSCROLLWS_HSCROLL風格位,由于CEditView : : PreCreateWindow顯示設置cs. style,調用基類函數后要修改cs . style


    BOOL CSampleEDitView : : PreCreateWindow (CREATESTRUCT&cs)


    {


    //First call basse class function .


    BOOL bResutl =CEditView : : PreCreateWindow (cs) ;


    // Now specify the new window style .


    cs.style &= ~ (ES_AUTOHSCROLL WS_HSCROLL);


    return bResult ;


    }


    18、通用控件的顯示窗口


    MFC提供了幾個CView派生的視窗類,封裝了通用控件的功能,但仍然使用工


    作框文檔顯示窗口體系結構:CEditView封裝了編輯控件,CTreeView保持了樹列表


    控件,CListView封裝了列表顯示窗口控件,CRichEditView可以處理多種編輯控件。


    19、移動窗口


    調用CWnd : : SetWindowPos并指定SWP_NOSIZE標志。目的位置與父窗口


    有關(頂層窗口與屏幕有關)。調用CWnd : : MoveWindow時必須要指定窗口


    的大小。


    //Move window to positoin 100 , 100 of its parent window .


    SetWindowPos (NULL, 100 , 100 , 0 , 0 , SWP_NOSIZE SWP_NOAORDER);


    20、重置窗口的大小


    調用CWnd: : SetWindowPos并指定SWP_NOMOVE標志, 也可調用


    CWnd : : MoveWindow 但必須指定窗口的位置。


    // Get the size of the window .


    Crect reWindow ;


    GetWindowRect (reWindow );


    //Make the window twice as wide and twice as tall .


    SetWindowPos (NULL , 0 , 0 , reWindow . Width ( ) *2,


    reWindow . Height () * 2,


    SWP_NOMOVE SWP_NOZORDER );


    21、如何單擊除了窗口標題欄以外的區(qū)域使窗口移動


    當窗口需要確定鼠標位置時Windows向窗口發(fā)送WM_NCHITTEST信息,可以處理


    該信息使Windows認為鼠標在窗口標題上。對于對話框和基于對話的應用程序,可


    以使用ClassWizard處理該信息并調用基類函數,如果函數返回HTCLIENT 則表明


    鼠標在客房區(qū)域,返回HTCAPTION表明鼠標在Windows的標題欄中。


    UINT CSampleDialog : : OnNcHitTest (Cpoint point )


    {


    UINT nHitTest =Cdialog: : OnNcHitTest (point );


    return (nHitTest = =HTCLIENT)? HTCAPTION : nHitTest ;


    }


    上述技術有兩點不利之處,其一是在窗口的客戶區(qū)域雙擊時, 窗口將極大;


    其二,它不適合包含幾個視窗的主框窗口。還有一種方法,當用戶按下鼠標左鍵


    使主框窗口認為鼠標在其窗口標題上,使用ClassWizard在視窗中處理WM_LBUTTODOWN


    信息并向主框窗口發(fā)送一個WM_NCLBUTTONDOWN信息和一個單擊測試HTCAPTION。


    void CSampleView : : OnLButtonDown (UINT nFlags , Cpoint point )


    {


    CView : : OnLButtonDow (nFlags , pont );


    //Fool frame window into thinking somene clicked on


    its caption bar .


    GetParentFrame ( ) ?> PostMessage (


    WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARAM (poitn .x , point .y) );


    }


    該技術也適用于對話框和基于對的應用程序,只是不必調用CWnd : : GetParentFrame 。


    void CSampleDialog : : OnLbuttonDown (UINT nFlags, Cpoint point )


    {


    Cdialog : : OnLButtonDow (nFlags, goint );


    //Fool dialog into thinking simeone clicked on its caption bar .


    PostMessage (WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARM (point.x , point. y ) )


    }


    22、如何改變視窗的背景顏色


    Windows向窗口發(fā)送一個WM_ERASEBKGND消息通知該窗口擦除背景,可以使用


    ClassWizard重載該消息的缺省處理程序來擦除背景(實際是畫),并返回TRUE


    防止Windows擦除窗口。


    //Paint area that needs to be erased.


    BOOL CSampleView : : OnEraseBkgnd (CDC* pDC)


    {


    // Create a pruple brush.


    CBrush Brush (RGB (128 , 0 , 128) );


    // Select the brush into the device context .


    CBrush* pOldBrush = pDC?>SelcetObject (&brush);


    // Get the area that needs to be erased .


    CRect reClip ;


    pDC?>GetCilpBox (&rcClip);


    //Paint the area.


    pDC?> PatBlt (rcClip.left , rcClip.top ,


    rcClip.Width ( ) , rcClip.Height ( ) , PATCOPY );


    //Unselect brush out of device context .


    pDC?>SelectObject (pOldBrush );


    // Return nonzero to half fruther processing .


    return TRUE;


    }


    23、如何改變窗口標題


    調用CWnd : : SetWindowText可以改變任何窗口(包括控件)的標題。


    //Set title for application's main frame window .


    AfxGetMainWnd ( ) ?> SetWindowText (_T("Application title") );


    //Set title for View's MDI child frame window .


    GetParentFrame ( ) ?> SetWindowText ("_T ("MDI Child Frame new title") );


    //Set title for dialog's push button control.


    GetDigitem (IDC_BUTTON) ?> SetWindowText (_T ("Button new title ") );


    如果需要經常修改窗口的標題(注:控件也是窗口),應該考慮使用半文檔化


    的函數AfxSetWindowText。該函數在AFXPRIV.H中說明,在WINUTIL.CPP中實現,在


    聯機幫助中找不到它,它在AFXPRIV.H中半文檔化,在以后發(fā)行的MFC中將文檔化。


    AfxSetWindowText的實現如下:


    voik AFXAPI AfxSetWindowText (HWND hWndCtrl , LPCTSTR IpszNew )


    {


    itn nNewLen= Istrlen (Ipaznew);


    TCHAR szOld [256];


    //fast check to see if text really changes (reduces flash in the controls )


    if (nNewLen >_contof (szOld) ||


    : : GetWindowText (hWndCrtl , szOld , _countof (szOld) !=nNewLen ||


    Istrcmp (szOld , IpszNew )! = 0


    {


    //change it


    : : SetWindowText (hWndCtrl , IpszNew );


    }


    }


    24、如何防止主框窗口在其說明中顯示活動的文檔名


    創(chuàng)建主框窗口和MDI子窗口進通常具有FWS_ADDTOTITLE風格位, 如果不希望在


    說明中自動添加文檔名, 必須禁止該風格位,可以使用ClassWizard重置


    CWnd: : PreCreateWindow并關閉FWS_ADDTOTITLE風格。


    BOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&cs)


    {


    //Turn off FWS_ADDTOTITLE in main frame .


    cs.styel & = ~FWS_ADDTOTITLE ; 


    return CMDIFrameWnd : : PreCreateWindow (cs );


    }


    關閉MDI子窗口的FWS _ADDTOTITLE風格將創(chuàng)建一個具有空標題的窗口,可以調


    CWnd: : SetWindowText來設置標題。記住自己設置標題時要遵循接口風格指南。


     

    相關文章
    本頁查看次數: