vc中对话框使用技巧集合_vc修改投钮的caption-程序员宅基地

技术标签: MFC/VC  

注:以下代码以一个名为CTest6Dlg的对话框类为例

--------------------------------------------------------------------------------

1. 在任务栏隐藏对话框
       ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);


--------------------------------------------------------------------------------

2. 使对话框为顶层窗口
         SetWindowPos(&this->wndTopMost, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);


--------------------------------------------------------------------------------

3. 在运行时添加最大化,最小化按钮
     SetWindowLong(this->m_hWnd, GWL_STYLE,
                   GetWindowLong(this->m_hWnd, GWL_STYLE) |
                   WS_MINIMIZEBOX | WS_MAXIMIZEBOX); 
      UpdateWindow();

 

--------------------------------------------------------------------------------

4. 使能对话框右上角关闭按钮

     在OnInitDialog中

     方法一:
        CMenu* menu = GetSystemMenu(FALSE);
        menu->ModifyMenu(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED );

     方法二:
        CMenu* menu = GetSystemMenu(FALSE);
        menu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);


--------------------------------------------------------------------------------

5. 当对话框一部分在屏幕外时,显示全部对话框
     SendMessage(DM_REPOSITION);


--------------------------------------------------------------------------------

6. 改变鼠标外形

     添加 WM_SETCURSOR 消息映射函数

     BOOL CTest6Dlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
     {
          SetCursor(AfxGetApp()->LoadStandardCursor(IDC_HELP));

          return 0;  
     }


--------------------------------------------------------------------------------

7. 改变对话框背景色和文本颜色

     在CTest6App的InitInstance中添加

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


--------------------------------------------------------------------------------

8. 改变对话框caption上的图标

     导入自己的图标资源到工程中,把原来ID为 IDR_MAINFRAME 的资源删除,把新的图标的ID命名为IDR_MAINFRAME


--------------------------------------------------------------------------------

9. 在主对话框显示前,显示一个login对话框

      BOOL CTest6App::InitInstance()
      {
           //...
           int nResponse;
           CLoginDlg loginDlg;

           nResponse = loginDlg.DoModal();
           if (nResponse == IDOK)
           {
           }
           if (nResponse == IDCANCEL)
           {
                return FALSE;
           }
  
           CTest6Dlg dlg;
           m_pMainWnd = &dlg;
           int nResponse = dlg.DoModal();
           if (nResponse == IDOK )
           {
           }
           else if (nResponse == IDCANCEL)
           {
           }
           return FALSE;
      }

然后重载CLoginDlg对话框的哦OnOK(),在其中判断条件
void CLoginDlg::OnOK() 
{
      if (条件满足)
         CDialog::OnOK();
      else 
         AfxMessageBox(_T("invalid password!"));
}

 

--------------------------------------------------------------------------------

10. 在对话框中添加工具栏

     方法一:添加以下代码到 OnInitDialog 中

      if ( !m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1) )
      {
           TRACE0("Failed to Create Dialog Toolbar/n");
           EndDialog(IDCANCEL);
      }

      CRect rcClientOld; // 久客户区RECT
      CRect rcClientNew; // 加入TOOLBAR后的CLIENT RECT
      GetClientRect(rcClientOld); //
      // Called to reposition and resize control bars in the client area of a window
      // The reposQuery FLAG does not really traw the Toolbar.   It only does the calculations.
      // And puts the new ClientRect values in rcClientNew so we can do the rest of the Math.
      //重新计算RECT大小
      RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
                        AFX_IDW_CONTROLBAR_LAST,
                        0,
                        reposQuery,
                        rcClientNew);

     // All of the Child Windows (Controls) now need to be moved so the Tollbar does not cover them up.
      //所有的子窗口将被移动,以免被TOOLBAR覆盖
      // Offest to move all child controls after adding Tollbar
      //计算移动的距离
      CPoint ptOffset(rcClientNew.left-rcClientOld.left,
        rcClientNew.top-rcClientOld.top);

      CRect rcChild;
      CWnd* pwndChild = GetWindow(GW_CHILD);   //得到子窗口
      while(pwndChild) // 处理所有子窗口
      {
           //移动所有子窗口
          pwndChild->GetWindowRect(rcChild);
           ScreenToClient(rcChild);
           rcChild.OffsetRect(ptOffset);
           pwndChild->MoveWindow(rcChild,FALSE);
           pwndChild = pwndChild->GetNextWindow();
      }

      CRect rcWindow;
      GetWindowRect(rcWindow); // 得到对话框RECT
      rcWindow.right += rcClientOld.Width() - rcClientNew.Width(); // 修改对话框尺寸
      rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height();
      MoveWindow(rcWindow,FALSE); // Redraw Window

      RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

     方法二:

         http://www.codeproject.com/dialog/dlgtoolstatusbar.asp


--------------------------------------------------------------------------------

11.响应对话框的最大化、最小化、关闭、恢复事件

      方法一:添加 WM_SYSCOMMAND 消息映射函数

      void CTest6Dlg::OnSysCommand(UINT nID, LPARAM lParam)
      {
           if ( (nID & 0xFFF0) == IDM_ABOUTBOX )
           {
                CAboutDlg dlgAbout;
                dlgAbout.DoModal();
       }
      else
      {
           if ( nID == SC_MAXIMIZE )
           {
                AfxMessageBox(_T("最大化"));
           }
           else if ( nID == SC_MINIMIZE )  
           {
                AfxMessageBox(_T("最小化"));
           }
           else if ( nID == SC_CLOSE )
           {
                AfxMessageBox(_T("关闭"));
           }

           CDialog::OnSysCommand(nID, lParam);
     }

      方法二:添加 WM_SIZE 消息映射函数

      void CTest6Dlg::OnSize(UINT nType, int cx, int cy)
      {
           CDialog::OnSize(nType, cx, cy);

           if ( nType == SIZE_MAXIMIZED )
           {
                AfxMessageBox(_T("最大化"));
           }
           else if ( nType == SIZE_MINIMIZED )
           {
                AfxMessageBox(_T("最小化"));
           }  
           else if ( nType == SIZE_RESTORED )
           {
                AfxMessageBox(_T("恢复"));
           }
      }


--------------------------------------------------------------------------------

12.代码实现窗口最小化,最大化,关闭

PostMessage(WM_SYSCOMMAND,   SC_MINIMIZE);
PostMessage(WM_SYSCOMMAND,   SC_MAXIMIZE);
PostMessage(WM_SYSCOMMAND,   SC_CLOSE);


--------------------------------------------------------------------------------

13.按下ESC和ENTER键时禁止关闭对话框
   
     方法一:

      (1) 重载OnCancel和OnOk,屏蔽其中的CDialog::OnCancel()和CDialog::OnOk();
      (2) 添加以下代码 
      void CTest6Dlg::OnSysCommand(UINT nID, LPARAM lParam)
      {
          if ((nID & 0xFFF0) == IDM_ABOUTBOX)
           {
              CAboutDlg dlgAbout;    //if you have an about dialog
               dlgAbout.DoModal();
           }
           else if ((nID & 0xFFF0) == SC_CLOSE)
           {
               //用户点击右上角"X"
               EndDialog(IDOK);  
       
           }
           else
           {
               CDialog::OnSysCommand(nID, lParam);
           }
      }

     方法二:

      BOOL CTest6Dlg::PreTranslateMessage(MSG* pMsg)
      {
           if ( pMsg->message == WM_KEYDOWN )
           {
                switch(pMsg->wParam)
                {
                case VK_ESCAPE:
                 return TRUE; //直接返回TRUE
                 break;
                case VK_RETURN:
                 return TRUE;
                 break;
                }
           }
           return CDialog::PreTranslateMessage(pMsg);
      }

      方法三:
          Q122489:
          How to Disable Default Pushbutton Handling for MFC Dialog
         http://support.microsoft.com/kb/122489/en-us


--------------------------------------------------------------------------------

14.在对话框中处理键盘鼠标消息

处理PreTranslateMessage消息

以下代码示例只演示了键盘WM_KEYDOWN消息,你也可以处理鼠标消息,比如WM_LBUTTONDOWN,WM_LBUTTONUP,WM_RBUTTONDOWN等。

BOOL CTest6Dlg::PreTranslateMessage(MSG* pMsg)  

     /**********************************************************/
     /*     当焦点在combobox(drop down风格)的edit上,响应回车             */ 
     /***********************************************************/ 
     if ( pMsg->message == WM_KEYDOWN ) 
     {         
         switch( pMsg->wParam ) 
         { 
         case VK_RETURN: 
             CEdit *pEdit = (CEdit*)m_combo1.GetWindow(GW_CHILD); 
             if(pMsg->hwnd == pEdit->m_hWnd ) 
             {  
                  AfxMessageBox("在combobox的edit中按下了Enter!"); 
             }             
             return TRUE; 
         } 
     } 

     /****************************************/ 
     /*    ALT为WM_SYSKEYDOWN                   */ 
     /****************************************/
     if( pMsg->message == WM_SYSKEYDOWN ) 
     {    
         switch( pMsg->wParam ) 
         { 
         case VK_F1:     
             if(::GetKeyState(VK_MENU) < 0)//ALT+F1
             { 
                 AfxMessageBox("按下了ALT+F1"); 
                 return TRUE; 
             }             
         }         
     } 
    
     /****************************************/ 
     /*      在clistctrl中按ctrl+A选中所有项   */ 
     /****************************************/ 
     if( pMsg->message == WM_KEYDOWN ) 
     {    
         if(pMsg->hwnd == GetDlgItem(IDC_LIST1)->m_hWnd) 
         { 
             switch( pMsg->wParam ) 
             { 
             case 65://A     
               if(::GetKeyState(VK_CONTROL) < 0)//Shift+enter 
               { 
                     for(int i=0; i<m_list.GetItemCount(); i++) 
                     { 
                         m_list.SetItemState(i, LVIS_SELECTED|LVIS_FOCUSED, 
                                             LVIS_SELECTED|LVIS_FOCUSED); 
                     } 
               } 
               return TRUE; 
             } 
         } 
     }  

     /****************************************/ 
     /*     当焦点在combobox,弹出自定义菜单    */ 
     /****************************************/      
     if(pMsg->message == WM_RBUTTONDOWN) 
     { 
         CEdit *pEdit = (CEdit*)m_combo1.GetWindow(GW_CHILD); 
         if(pMsg->hwnd == pEdit->m_hWnd) 
         { 
             DWORD dwPos = GetMessagePos(); 
             CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); 
             ScreenToClient(&point); 
             ClientToScreen(&point); 
             
             CMenu menu; 
             VERIFY( menu.LoadMenu( IDR_MENU1 ) ); 
             CMenu* popup = menu.GetSubMenu(0); 
             ASSERT( popup != NULL ); 
             popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this ); 
         }         
     } 

     return CDialog::PreTranslateMessage(pMsg); 
}


--------------------------------------------------------------------------------

15.对话框启动即隐藏

     添加 WM_SHOWWINDOW 的消息映射

      void CTest6Dlg::OnShowWindow(BOOL bShow, UINT nStatus)
      {
           if ( GetStyle() & WS_VISIBLE )
           {
                CDialog::OnShowWindow(bShow, nStatus);
           }
           else
           {
                long Style = ::GetWindowLong(*this, GWL_STYLE);
                ::SetWindowLong(*this, GWL_STYLE, Style | WS_VISIBLE);
                CDialog::OnShowWindow(SW_HIDE, nStatus);
           }
      }


----------------------------------------------------------------------

 

16.对话框自动停靠在屏幕边

     const int DETASTEP = 50;
      BOOL AdjustPos(CWnd *pWnd, CRect* lpRect)
      {
         //自动靠边
         int iSX = GetSystemMetrics(SM_CXFULLSCREEN);
         int iSY = GetSystemMetrics(SM_CYFULLSCREEN);
         RECT rWorkArea;
         BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkArea, 0);

         CRect rcWA;
         if ( !bResult )
         {
             //如果调用不成功就利用GetSystemMetrics获取屏幕面积
             rcWA = CRect(0,0,iSX,iSY);
         }
         else
             rcWA = rWorkArea;

         int iX = lpRect->left;
         int iY = lpRect->top;
         if ( iX < rcWA.left + DETASTEP && iX!=rcWA.left )
         {
             //调整左
             pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE);
             lpRect->OffsetRect(rcWA.left-iX,0);
             AdjustPos(lpRect);
             return TRUE;
         }
         if ( iY < rcWA.top + DETASTEP && iY!=rcWA.top )
         {
             //调整上
             pWnd->SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE);
             lpRect->OffsetRect(0,rcWA.top-iY);
             AdjustPos(lpRect);
             return TRUE;
         }
         if ( iX + lpRect->Width() > rcWA.right - DETASTEP && iX !=rcWA.right-lpRect->Width() )
         {
             //调整右
             pWnd->SetWindowPos(NULL ,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE);
             lpRect->OffsetRect(rcWA.right-lpRect->right,0);
             AdjustPos(lpRect);
             return TRUE;
         }
         if ( iY + lpRect->Height() > rcWA.bottom - DETASTEP && iY !=rcWA.bottom-lpRect->Height() )
         {
             //调整下
             pWnd->SetWindowPos(NULL ,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE);
             lpRect->OffsetRect(0,rcWA.bottom-lpRect->bottom);
             return TRUE;
         }
         return FALSE;
     }

     //然后在ONMOVEING事件中使用如下过程调用
     CRect r=*pRect;
     AdjustPos(this, &r);
     *pRect=(RECT)r;


--------------------------------------------------------------------------------

17.单击窗口任意位置都可拖动窗口
     方法一:
      添加 WM_LBUTTONDOWN 的消息映射
      void CTest6Dlg::OnLButtonDown(UINT nFlags, CPoint point)
      {
           PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, 0);

           CDialog::OnLButtonDown(nFlags, point);
      }

     方法二:
     添加 WM_NCHITTEST 的消息映射
     注意:在classwizard->message中找不到WM_NCHITTEST的,需要在选项卡class info->message filter中选择window后该消息才会出现在message中。
       void CTest6Dlg::OnNCHitTest(CPoint point)
      {
             return HTCAPTION;
       //     return CDialog::OnNCHitTest(point);
      }

      或者参考
        http://msdn.microsoft.com/msdnmag/issues/02/12/CQA/default.aspx


--------------------------------------------------------------------------------

18.用Enter键替换Tab键实现焦点切换

      BOOL CTest6Dlg::PreTranslateMessage(MSG* pMsg)
      {
         if ( pMsg->message == WM_KEYDOWN )
           {
               if ( pMsg->wParam == VK_RETURN )
                    pMsg->wParam = VK_TAB;
           } 
           return CDialog::PreTranslateMessage(pMsg);
      }


--------------------------------------------------------------------------------

19.在对话框添加快捷键

      (1) 在CXXXApp中类中添加声明
         HACCEL m_haccel;
      (2) 在resource view中右键点击树的根目录,选择insert,添加一个新的Accelerator,默认ID为IDR_ACCELERATOR1。
          在其中添加相应菜单的快捷键。
      (3) 在BOOL CXXXApp::InitInstance()中添加代码
         m_haccel = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));
      (4) 添加CXXXApp类的 ProcessMessageFilter 消息映射函数
          BOOL CTest6App::ProcessMessageFilter(int code, LPMSG lpMsg)
          {
               if ( m_haccel )
               {
                   if ( ::TranslateAccelerator(m_pMainWnd->m_hWnd, m_haccel, lpMsg) )
                        return TRUE;
               }
               return CWinApp::ProcessMessageFilter(code, lpMsg);
          }

或者参考
Q100770:
How to use accelerator keys and a main menu on the dialog box in Visual C++
http://support.microsoft.com/kb/100770/en-us

Adding Hot Keys to your Application
http://msdn.microsoft.com/msdnmag/issues/1200/c/default.aspx


--------------------------------------------------------------------------------

20.对话框全屏

     int cx, cy;
     HDC dc = ::GetDC(NULL);
     cx = GetDeviceCaps(dc,HORZRES) + GetSystemMetrics(SM_CXBORDER);
     cy = GetDeviceCaps(dc,VERTRES) + GetSystemMetrics(SM_CYBORDER);
     ::ReleaseDC(0,dc);

     // Remove caption and border
     SetWindowLong(m_hWnd, GWL_STYLE,
                     GetWindowLong(m_hWnd, GWL_STYLE) & (~(WS_CAPTION | WS_BORDER)));

     // Put window on top and expand it to fill screen
     ::SetWindowPos(m_hWnd, HWND_TOPMOST,
           -(GetSystemMetrics(SM_CXBORDER)+1),
           -(GetSystemMetrics(SM_CYBORDER)+1),
           cx+1,cy+1, SWP_NOZORDER);
     或参考
        http://www.codeguru.com/cpp/w-d/dislog/dialog-basedapplications/article.php/c1837/


--------------------------------------------------------------------------------

21.控制对话框最大最小尺寸

     (1) 对话框的属性的必须是resizing的
     (2) 打开classwizard->class info标签页->message filter中选择window
     (3) 添加 WM_GETMINMAXINFO 消息映射
         void CTest6Dlg::OnGetMinMaxInfo(MINMAXINFO *lpMMI)
         {
              lpMMI->ptMinTrackSize = CPoint(200, 200);
         }


--------------------------------------------------------------------------------

22. 创建无模式对话框

Q103788:
Creating a Modeless Dialog Box with MFC Libraries
http://support.microsoft.com/kb/103788/EN-US/

Visual C++ MFC Samples      
MODELESS Sample: Uses a CDialog Object as a Modeless Dialog Box
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcsample/html/_sample_mfc_MODELESS.asp


--------------------------------------------------------------------------------

23.在对话框中改变菜单项状态(enable/disable, check/uncheck, change text)

Q242577:
You cannot change the state of a menu item from its command user-interface handler if the menu is attached to a dialog box in Visual C++
http://support.microsoft.com/kb/242577/en-us


--------------------------------------------------------------------------------

24. 按下F1出现帮助

Q141724:
Context-Sensitive Help in a CDialog Object
http://support.microsoft.com/kb/141724/en-us


msdn中的介绍
http://msdn2.microsoft.com/en-us/library/dyd1yfww.aspx

或者如果你要屏蔽按下F1后出现的“找不到*.hlp文件”的提示对话框
添加 WM_HELPINFO 消息映射
BOOL CTest6Dlg::OnHelpInfo(HELPINFO* pHelpInfo) 
{
      return TRUE;
     //return CDialog::OnHelpInfo(pHelpInfo);//屏蔽该句
}

 

--------------------------------------------------------------------------------

25. 对话框初始化设置输入焦点的问题
默认情况下,对话框初始化显示的焦点按照在对话框编辑期间设置的tab order的第一个控件来设置的。(设置tab order可在对话框的resource view中用Ctrl+D显示出来,点鼠标进行顺序设置)。如果想人为的改变初始化时的输入焦点,可在对话框的OnInitDialog中把return   TRUE; 改为 return   FALSE;

MSDN上的解释如下:

Return Value
Specifies whether the application has set the input focus to one of the controls in the dialog box. If OnInitDialog returns nonzero, Windows sets the input focus to the first control in the dialog box. The application can return 0 only if it has explicitly set the input focus to one of the controls in the dialog box.


--------------------------------------------------------------------------------


26. 在对话框间传递数据
CDlg1::OnButton1() 

       CDlg2 dlg2; 
       dlg2.m_str = _T("你好"; )
       dlg2.m_bJudge = TRUE; 
       dlg2.DoModal(); 


//Dlg2.h 
public: 
      CString m_str; 
      BOOL m_bJudge; 


//Dlg2.cpp 
CDlg2::OnInitDialog() 

     if (m_bJudge) 
         GetDlgItem(IDC_EDIT1)->SetWindowText(m_str); 
}


--------------------------------------------------------------------------------


27. 在 dlg1 中打开 dlg2 时,dlg2 能修改 dlg1 中的成员变量

//dlg1.cpp
     #include "dlg2.h"
     CDlg1::OnButton1()
     {
           CDlg2 dlg2;
           dlg2.m_pDlg1 = this;
           dlg2.DoModal();
     }

//dlg2.h
class CDlg1;//添加dlg1类的声明
class CDlg2 : public CDialog
{
...
public:
     CDlg1 *m_pDlg1;
}

//dlg2.cpp
#include "dlg1.h"

至此,你可以在dlg2.cpp中通过m_pDlg1操作CDlg1类中的成员变量了。

 

--------------------------------------------------------------------------------


28. 改变对话框字体,对话框大小改变的问题

Q145994:
How to calculate dialog box units based on the current font in Visual C++
http://support.microsoft.com/kb/q145994/

Q125681:
How To Calculate Dialog Base Units with Non-System-Based Font
http://support.microsoft.com/kb/125681/en-us

 

--------------------------------------------------------------------------------


29. 进行大数据量计算的时候,导致界面挂起无响应的问题

     当在程序中需要进行大数据量计算的时候(比如搜索磁盘,大数据量传输等),由于这些计算过程是在界面线程(UI Process)中,由此引发了界面线程的消息阻塞。我们创建一个工作线程(worker thread)来处理计算过程,以解决该问题。
下面是一个简单的创建一个工作线程的实现:
//xxxdlg.h
static UINT MyThread(LPVOID pParam);
CWinThread* pMyThread;

//xxxdlg.cpp
CXXXDlg::OnButton1()
{
      pMyThread = AfxBeginThread(MyThread, this);
      pMyThread = NULL;
}

UINT CXXXDlg::MyThread(LPVOID pParam)
{
      CXXXDlg *pDlg = (CXXXDlg *)pParam;

      //这里添加计算过程

      return 0;
}


--------------------------------------------------------------------------------

30. 工程资源的合并

以把B对话框的资源插入到A对话框为例:

(1) 生成一个*.ogx文件
     打开B工程,在ClassView中鼠标右键点击所需的对话框类,单击"Add to Gallery"。
     这时,会在 " C:/Program Files/Microsoft Visual Studio/Common/MSDev98/Gallery/工程B " 的目录下产生一个ogx文件。

(2) 插入该*.ogx文件
     打开A工程,选择菜单Project->Add To Project->components and controls... ,选择刚生成的ogx文件,然后Insert。

这时B对话框资源和对话框类就插入到A中了。。


--------------------------------------------------------------------------------

31. 在网上可以找到很多有用的代码,我只是把一些常用的功能列出链接,方便查看

http://support.microsoft.com               
http://www.codeproject.com/dialog/
http://www.codeguru.com/Cpp/W-D/dislog/


改变对话框大小时同时改变控件大小

http://www.codeproject.com/dialog/easysize.asp
http://www.codeproject.com/dialog/resizabledialog.asp
http://www.vchelp.net/vchelp/archive.asp?type_id=5&class_id=1&cata_id=1&article_id=548&search_term=
http://www.vchelp.net/vchelp/archive.asp?type_id=5&class_id=1&cata_id=1&article_id=538&search_term=


--------------------------------------------------------------------------------
如何在可变大小(resizing)的对话框中实现滚动窗口

Q262954:
How to create a resizeable dialog box with scroll bars in Visual C++
http://support.microsoft.com/default.aspx?scid=kb;en-us;262954
http://www.codeproject.com/dialog/scrollablechilddialog.asp


--------------------------------------------------------------------------------
从某一点或某一边逐渐变大显示对话框

http://www.codeproject.com/dialog/canidialog.asp


--------------------------------------------------------------------------------
一个重载的MessageBox类

http://www.codeproject.com/dialog/xmessagebox.asp


--------------------------------------------------------------------------------
option设置对话框(左边是树,右边是子对话框)

实现原理:create多个child类型的对话框,然后全部hide,点击左边树的item时,显示相应子对话框。

Q103375:
MultiDlg.exe Demonstrates Dynamic Child Dialog Boxes
http://support.microsoft.com/kb/103375/en-us

http://www.codeproject.com/dialog/ezoptionsdlg.asp
http://www.codeproject.com/dialog/csettingsdlg.asp
http://www.codeguru.com/cpp/w-d/dislog/optionsdialogs/article.php/c1953/
http://www.codeguru.com/cpp/w-d/dislog/optionsdialogs/article.php/c2015/


--------------------------------------------------------------------------------
实现MSN的右下角的消息弹出提示窗口

http://www.codeproject.com/dialog/statusbarmsgwnd.asp


--------------------------------------------------------------------------------
Tip of the day(每日一贴)功能的实现
     
http://www.codeproject.com/dialog/XHTMLTipOfTheDay.asp
http://www.codeguru.com/cpp/w-d/dislog/tipoftheday/article.php/c4993/


--------------------------------------------------------------------------------
不规则对话框
     
http://www.codeproject.com/dialog/SimpleIrregular.asp


--------------------------------------------------------------------------------
扩展和收缩对话框
     
http://www.codeproject.com/dialog/dlgexpand.asp


--------------------------------------------------------------------------------
对话框渐变色
     
http://www.codeproject.com/dialog/WinMakeInactive.asp


--------------------------------------------------------------------------------
屏幕捕捉
     
http://www.codeproject.com/dialog/screencap.asp


--------------------------------------------------------------------------------
对话框菜单添加“最近使用文件列表”功能
     
http://www.codeproject.com/dialog/rfldlg.asp


--------------------------------------------------------------------------------
关闭对话框时,逐渐消失
    
http://www.codeguru.com/cpp/w-d/dislog/animation/article.php/c5063/


--------------------------------------------------------------------------------
对话框背景bitmap
    
http://www.codeguru.com/cpp/w-d/dislog/bitmapsimages/article.php/c1877/


--------------------------------------------------------------------------------
透明对话框
    
http://www.codeguru.com/cpp/w-d/dislog/miscellaneous/article.php/c5065/
http://www.codeguru.com/cpp/w-d/dislog/miscellaneous/article.php/c5019/


--------------------------------------------------------------------------------
在对话框中创建view
    
http://www.codeguru.com/cpp/w-d/dislog/article.php/c5009/


--------------------------------------------------------------------------------
Splash Screen

Q817372:
How to insert a splash screen in a dialog-based application by using Visual C++ .NET or Visual C++ 2005
http://support.microsoft.com/kb/817372/en-us  

Q815376:
How to create and insert a splash screen in an SDI application or in an MDI application by using Visual C++ .NET or Visual C++ 2005
http://support.microsoft.com/kb/815376/en-us

http://www.codeguru.com/cpp/w-d/dislog/splashscreens/article.php/c2011/
http://www.codeguru.com/cpp/w-d/dislog/miscellaneous/article.php/c5019/
http://www.codeguru.com/cpp/w-d/dislog/splashscreens/article.php/c5029/


--------------------------------------------------------------------------------
分割对话框

http://www.codeguru.com/cpp/w-d/dislog/splitterwindowswithingdialogs/article.php/c4973/
http://www.codeguru.com/cpp/w-d/dislog/splitterwindowswithingdialogs/article.php/c2031/
http://www.codeguru.com/cpp/w-d/dislog/splitterwindowswithingdialogs/article.php/c1979/


--------------------------------------------------------------------------------
标题栏Title Bar
    
http://www.codeguru.com/cpp/w-d/dislog/titlebar/article.php/c1897/


--------------------------------------------------------------------------------
添加状态栏statusbar和工具栏toolbar

Q123158:
Adding Control Bars to Foundation Classes Dialogs
http://support.microsoft.com/kb/123158/en-us

Visual C++ MFC Samples      
DLGCBR32 Sample: Demonstrates Adding a Status Bar and Toolbar to Dialog Boxes
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcsample/html/_sample_mfc_DLGCBR32.asp

http://www.codeguru.com/cpp/w-d/dislog/toolbarsandstatusbars/article.php/c1955/
http://www.codeguru.com/cpp/w-d/dislog/toolbarsandstatusbars/article.php/c1939/
http://www.codeguru.com/cpp/w-d/dislog/toolbarsandstatusbars/article.php/c1949/


--------------------------------------------------------------------------------
Tooltip

Q141758:
How to add tooltips for controls to an MFC modal dialog box
http://support.microsoft.com/kb/141758/en-us

http://www.codeguru.com/cpp/w-d/dislog/tooltipsfordialogcontrols/article.php/c2017/
http://www.codeguru.com/cpp/w-d/dislog/tooltipsfordialogcontrols/article.php/c1843/    
http://www.codeguru.com/cpp/w-d/dislog/tooltipsfordialogcontrols/article.php/c1839/
http://www.codeproject.com/miscctrl/pptooltip.asp

 

--------------------------------------------------------------------------------
从对话框边缘平滑弹出对话框

http://www.codeguru.com/cpp/w-d/dislog/miscellaneous/article.php/c5061/


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=658248

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011135902/article/details/77896220

智能推荐

Flink实战3-数据实时写入HBase的Sink方式_flink sink hbase-程序员宅基地

文章浏览阅读5.4k次,点赞3次,收藏26次。背景接入Kafka实时数据经过数据处理写入HBase,后续会应用于类似变量系统以及实时日志中,对于变量系统这类中间需要做实时缓存宽表可能使用HBase连接极其频繁,所以是使用客户端还是Sink的方式就看实际情况而定,具体数据处理后的落库Sink还是比较方便的;摘要关键字Flink,Sink,HBase,数据处理,数据流转设计使用的是Max Well数据源,将业务数据接入Kafka,Flink-Source接入Kafka,中间经过数据流转将数据存储到HBase作实时表;实现说明_flink sink hbase

动态改变title标题_dash 标题-程序员宅基地

文章浏览阅读276次。文章目录动态改变title标题实现效果该上代码了动态改变title标题1、主要用到Vue的自定义指令directive。参考地址: link.实现效果该上代码了一、在main.js引入 // 动态改变title标题 Vue.directive('title', { inserted: function(el, binding) { document.title = binding.value; }, });二、将v-title放在每个文件的根节_dash 标题

使用组件化开发思路替换 SAP Spartacus 的 Logo_替换sap的思路-程序员宅基地

文章浏览阅读299次。简单来说,组件是应用程序的任何部分,可以在逻辑上分组并被视为单一元素,理想情况下可以作为应用程序其余部分的构建块重用。这个组件中可能有其他组件,也可能在其他组件中使用,但每个单独的“组件”都是一个独立的东西。例如,您可能有一个在每个页面上都有 logo 的网站。因此,您可以创建一个“标题组件”,然后您可以为每个页面重用该标题组件,而不是从头开始编写代码。这个标题组件可能包含一个“搜索栏组件”和一个“导航栏”组件,它们是它们自己的独立元素,它们在标题中使用,但也可以在站点的其他地方重用。看个具体的例子:我_替换sap的思路

python界面登录-验证码(三)_pythonui自动化登录验证码-程序员宅基地

文章浏览阅读1.5k次。真的要好好学一下写作了,等好好的有条理的整理自己做过的工作才能方便的进行下一步的使用,能整理好自己的学习的东西才能提高效率,更加明确的进行下一步的工作提高自己的工作效率!!!下一步就是在以下前提下进行网页的登录和课程的查询了:import osimport timefrom bs4 import BeautifulSoup from selenium import webdriv..._pythonui自动化登录验证码

opencv3.1(python3.5)安装_python3.5 opencv-python==3.1.0.0-程序员宅基地

文章浏览阅读7.6k次。1. python管网下载 安装python3.5 (32bit或者64bit)2. 下载 opencv3.1 ( 32bit 或者64bit )opencv_python-3.1.0-cp35-cp35m-win32.whlopencv_python-3.1.0-cp35-cp35m-win_amd64.whl下载链接为:这个链接有多个python的库 numpy_python3.5 opencv-python==3.1.0.0

spring 与hibernate多数据源配置-程序员宅基地

文章浏览阅读89次。Spring2.0.1以后的版本已经支持配置多数据源,并且可以在运行的时候动态加载不同的数据源。通过继承AbstractRoutingDataSource就可以实现多数据源的动态转换。目前做的项目就是需要访问12个数据源,每个数据源的表结构都是相同的,所以要求数据源的变动对于编码人员来说是透明,也就是说同样SQL语句在不同的环境下操作的数据库是不一样的。具体的配置如下:一、首先需要写一个静..._hibernate设置多数据源 parentdatasource

随便推点

自定义CollectionViewCell之-----瀑布流效果_cellcollectionview瀑布流-程序员宅基地

文章浏览阅读1.1k次。本文详细的书写了如何达到瀑布流效果(附图片)_cellcollectionview瀑布流

分布式事务之基础理论(CAP/BASE理论)篇_分布式事务基础理论cap-程序员宅基地

文章浏览阅读346次。一、概述通过前面的学习,我们了解到了分布式事务的基础概念。与本地事务不同的是,分布式系统之所以叫分布式,是因为提供服务的各个节点分布在不同机器上,相互之间通过网络交互。不能因为有一点网络问题就导致整个系统无法提供服务,网络因素成为了分布式事务的考量标准之一。因此,分布式事务需要更进一步的理论支持,接下来,我们先来学习一下分布式事务的CAP理论。在讲解分布式事务控制解决方案之前需要先学习一些基础理论,通过理论知识指导我们确定分布式事务控制的目标,从而帮助我们理解每个解决方案。二、CAP理论CAP是_分布式事务基础理论cap

小程序实现点击按钮回到顶部_微信小程序 topreturnbtn-程序员宅基地

文章浏览阅读526次。按钮样式wxml<view class="topbtn" bindtap="gotopAction" wx:if="{{up_show}}"> <image src="./../../image/topimg.png"></image></view>wxss.topbtn{ position: fixed; width: 120rpx; height: 120rpx; border-radius: 50%; bottom:._微信小程序 topreturnbtn

docker-compose运行ElasticSearch、Kibana、Cerebro_docker-compose elasticsarch kib-程序员宅基地

文章浏览阅读1.1k次。docker-compose.yamlversion: '2.2'services: cerebro: image: lmenezes/cerebro:0.8.4 container_name: cerebro ports: - "9000:9000" command: - -Dhosts.0.host=http://elasticsearch:9200 networks: - es7net kibana: _docker-compose elasticsarch kib

一篇文章快速搞定——deepin搭建java开发环境_deepin jdk-程序员宅基地

文章浏览阅读4.8k次,点赞5次,收藏16次。linux发行版---深度deepin操作系统搭建java开发环境,deepin从入门到放弃系列_deepin jdk

PASCAL VOC 数据集转化为yolo数据集格式_pascalvoc转换成yolov c#-程序员宅基地

文章浏览阅读6.3k次,点赞16次,收藏39次。常常我们拿到的数据集格式是PASCAL VOC的,当我们要用yolo系列的检测算法时,就要将VOC的数据格式转化为yolo所需要的格式。小编就给大家展示转化的过程。_pascalvoc转换成yolov c#

推荐文章

热门文章

相关标签