1.用鼠標(biāo)移動(dòng)基于對話框的無標(biāo)題欄程序的簡單方法
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中發(fā)消息給B然后B處理。
準(zhǔn)備工作,先定義消息,如下
#define WM_B_NOTIFY WM_USER + 300
首先,必須將B的對話框句柄傳送給A,暫時(shí)叫m_hWndB;
在A的發(fā)送消息的地方這樣寫:
::SendMessage( m_hWndB,WM_B_NOTIFY,TRUE,NULL );
這樣A中的處理就完了,下面說B 中的
首先定義消息處理函數(shù),如下
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.如何改變框?qū)υ捇虼绑w視窗的背景顏色
調(diào)用CWinApp : : SetDialogBkColor可以改變所有應(yīng)用程序的背景顏色。第一個(gè)參數(shù)指定了背景顏色,第二個(gè)參數(shù)指定了文本顏色。下例將應(yīng)用程序?qū)υ捲O(shè)置為藍(lán)色背景和黃色文本。
BOOL CSampleApp : : InitInstance ( )
{
…
//use blue dialog with yellow text .
SetDialogBkColor (RGB (0, 0, 255 ), RGB ( 255 , 255 , 0 ) ) ;
…
}
需要重畫對話(或?qū)υ挼淖涌丶r(shí),Windows向?qū)υ挵l(fā)送消息WM_CTLCOLOR,通常用戶可以讓Windows選擇繪畫背景的刷子,也可重置該消息指定刷子。下例說明了創(chuàng)建一個(gè)紅色背景對話的步驟。
首先,給對話基類增加一人成員變量CBursh :
class CMyFormView : public CFormView
{
…
private :
CBrush m_ brush ; // background brush
…
} ;
其次, 在類的構(gòu)造函數(shù)中將刷子初始化為所需要的背景顏色。
CMyFormView : : CMyFormView ( )
{
// Initialize background brush .
m_brush .CreateSolidBrush (RGB ( 0, 0, 255 ) )
}
最后,使用ClassWizard處理WM_CTLCOLOR消息并返回一個(gè)用來繪畫對話背景的刷子句柄。注意:由于當(dāng)重畫對話控件時(shí)也要調(diào)用該函數(shù),所以要檢測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.如何實(shí)現(xiàn)點(diǎn)一下對話框外面的區(qū)域,自動(dòng)隱藏對話框?
[問題提出]
如果想在點(diǎn)擊對話框外面的地方使得對話框關(guān)閉,該如何做?
[解決方法]
試試下面的代碼,原理是在激活對話框時(shí),捕獲鼠標(biāo)的動(dòng)作,當(dāng)鼠標(biāo)點(diǎn)擊時(shí)判斷是否點(diǎn)擊在對話框外,是的話就釋放對話框.
[程序?qū)崿F(xiàn)]
建立名為My的對話框程序.實(shí)現(xiàn)如下步驟:
在MyDlg.h中加入:
class CShowWindow1Dlg : public CDialog
{
// Construction
public:
int m_cx;
int m_cy;
......
};
在MyDlg.cpp中:
//定義消息映象,處理鼠標(biāo)單擊及激活
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列表中就會(huì)出現(xiàn)WM_ACTIVATE,選中,點(diǎn)擊Add Handler
2)SM_CXDLGFRAME,SM_CYDLGFRAME NT中取得有WS_DLGFRAMEstyle風(fēng)格的窗口的高和寬 95中已經(jīng)廢棄而采用SM_CX_FIXEDFRAME和SM_CYFIXEDFRAME
5.如何使FormView中顯示dialog時(shí),不是凹的
[問題提出]
為什么FormView中顯示dialog時(shí),是凹的,能不能不這樣
[解決方法]
在Dialog的屬性中:
增加屬性WS_BORDER 或者 WS_EX_WINDOWEDGE
用程序?qū)崿F(xiàn):
pView->ModifyStyle(,WS_BORDER) 或者pView->ModifyStyleEx(,WS_EX_WINDOWEDGE )