大龙的博客

常用链接

统计

最新评论

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_FIXEDFRAMESM_CYFIXEDFRAME

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

   [问题提出]
  为什么FormView中显示dialog,是凹的,能不能不这样
   [解决方法]
  Dialog的属性中:
    增加属性WS_BORDER   或者 WS_EX_WINDOWEDGE
  用程序实现:
   pView->ModifyStyle(,WS_BORDER) 或者pView->ModifyStyleEx(,WS_EX_WINDOWEDGE )

posted on 2009-01-07 02:45 大龙 阅读(430) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理