天天看點

VC程式設計小技巧之對話框 -------- 轉

1.用滑鼠移動基于對話框的無标題欄程式的簡單方法

void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point)

{

     //一句話解決問題

     SendMessage(WM_SYSCOMMAND,0xF012,0);

     CDialog::OnLButtonDown(nFlags, point);

}

    SendMessage(FrmMain->Handle,WM_SYSCOMMAND,SC_MAXIMIZE,0);  //最大化窗體

    SendMessage(FrmMain->Handle,WM_SYSCOMMAND,SC_RESTORE,0); //還原窗體

    SendMessage(FrmMain->Handle,WM_SYSCOMMAND,SC_MINIMIZE,0); //最小化窗體

2.對話框消息映射

有對話框A,B

從A中發消息給B然後B處理。

準備工作,先定義消息,如下

#define WM_B_NOTIFY WM_USER + 300

首先,必須将B的對話框句柄傳送給A,暫時叫m_hWndB;

在A的發送消息的地方這樣寫:

::SendMessage( m_hWndB,WM_B_NOTIFY,TRUE,NULL );

這樣A中的處理就完了,下面說B 中的

首先定義消息處理函數,如下

void B::ModiNotify( WPARAM wParam, LPARAM lParam )

{

     MessageBox("小樣,我就不信,搞不定你!");

}

然後加消息隐射,如下:

BEGIN_MESSAGE_MAP(CB, CDialog)

     //{{AFX_MSG_MAP(CRPServerDlg)

     ON_MESSAGE( WM_B_NOTIFY,ModiNotify )

     //}}AFX_MSG_MAP

END_MESSAGE_MAP()

3.如何改變框對話或窗體視窗的背景顔色

調用CWinApp : : SetDialogBkColor可以改變所有應用程式的背景顔色。第一個參數指定了背景顔色,第二個參數指定了文本顔色。下例将應用程式對話設定為藍色背景和黃色文本。

BOOL CSampleApp : : InitInstance ( )

{

//use blue dialog with yellow text .

SetDialogBkColor (RGB (0, 0, 255 ), RGB ( 255 , 255 , 0 ) ) ;

}

需要重畫對話(或對話的子控件)時,Windows向對話發送消息WM_CTLCOLOR,通常使用者可以讓Windows選擇繪畫背景的刷子,也可重置該消息指定刷子。下例說明了建立一個紅色背景對話的步驟。

首先,給對話基類增加一人成員變量CBursh :

class CMyFormView : public CFormView

{

private :

CBrush m_ brush ; // background brush

} ;

其次, 在類的構造函數中将刷子初始化為所需要的背景顔色。

CMyFormView : : CMyFormView ( )

{

// Initialize background brush .

m_brush .CreateSolidBrush (RGB ( 0, 0, 255 ) )

}

最後,使用ClassWizard處理WM_CTLCOLOR消息并傳回一個用來繪畫對話背景的刷子句柄。注意:由于當重畫對話控件時也要調用該函數,是以要檢測nCtlColor參量。

HBRUSH CMyFormView : : OnCtlColor (CDC* pDC , CWnd*pWnd , UINT nCtlColor )

{

// Determine if drawing a dialog box . If we are , return +handle to

//our own background brush . Otherwise let windows handle it .

if (nCtlColor = = CTLCOLOR _ DLG )

return (HBRUSH) m_brush .GetSafeHandle ( ) ;

return CFormView : : OnCtlColor (pDC, pWnd , nCtlColor );

}

4.如何實作點一下對話框外面的區域,自動隐藏對話框?

   [問題提出]

    如果想在點選對話框外面的地方使得對話框關閉,該如何做?

   [解決方法]

    試試下面的代碼,原理是在激活對話框時,捕獲滑鼠的動作,當滑鼠點選時判斷是否點選在對話框外,是的話就釋放對話框.

   [程式實作]

    建立名為My的對話框程式.實作如下步驟:

    在MyDlg.h中加入:

     class CShowWindow1Dlg : public CDialog

     {

     // Construction

     public:

         int m_cx;

         int m_cy;

         ......

     };

    在MyDlg.cpp中:

     //定義消息映象,處理滑鼠單擊及激活

     BEGIN_MESSAGE_MAP(CMyDlg, CDialog)

         //{{AFX_MSG_MAP(CMyDlg)

         ON_WM_LBUTTONDOWN()

         ON_WM_ACTIVATE()

         //}}AFX_MSG_MAP

     END_MESSAGE_MAP()

     void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)

     {

         CRect rect;

         GetClientRect(&rect);

         rect.InflateRect(m_cx, m_cy);

         //Release dialog if the user click outside it.

         if(!rect.PtInRect(point))

         {

           EndDialog(IDCANCEL);

         }

         CDialog::OnLButtonDown(nFlags, point);

     }

     void CMyDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)

     {

         CDialog::OnActivate(nState, pWndOther, bMinimized);

         if( nState == WA_ACTIVE || nState == WA_CLICKACTIVE)

             SetCapture();

         else

             ReleaseCapture();

     }

     BOOL CMyDlg::OnInitDialog()

     {

         CDialog::OnInitDialog();

         .....

         OSVERSIONINFO info;

         memset((char*)&info, 0, sizeof(OSVERSIONINFO));

         info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

         if(GetVersionEx(&info))

         {   //we don't run on Win32s, so check only two values

           if(info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)

           {   //On windows 95

               m_cx = GetSystemMetrics(SM_CXFIXEDFRAME);

               m_cy = GetSystemMetrics(SM_CYFIXEDFRAME);

           }

           else

           {   //On NT

               m_cx = GetSystemMetrics(SM_CXDLGFRAME);

               m_cy = GetSystemMetrics(SM_CYDLGFRAME);

           }

         }

     }

     說明:

     1)WM_ACTIVATE消息在ClassWizard中沒有,按如下步驟添加,右擊CMyDlg類,選Add Windows Message Handle,接着在Filter for messages available to中選Window,在New Windows messages/events清單中就會出現WM_ACTIVATE,選中,點選Add Handler

     2)SM_CXDLGFRAME,SM_CYDLGFRAME   NT中取得有WS_DLGFRAMEstyle風格的視窗的高和寬 95中已經廢棄而采用SM_CX_FIXEDFRAME和SM_CYFIXEDFRAME

5.如何使FormView中顯示dialog時,不是凹的

   [問題提出]

  為什麼FormView中顯示dialog時,是凹的,能不能不這樣

   [解決方法]

  在Dialog的屬性中:

    增加屬性WS_BORDER   或者 WS_EX_WINDOWEDGE

  用程式實作:

   pView->ModifyStyle(,WS_BORDER) 或者pView->ModifyStyleEx(,WS_EX_WINDOWEDGE )

繼續閱讀