VC常用技术新编

简介:

以下技术,只提供函数名和简单应用事例。详细内容参看 MSDN ,事例中的代码如无特别说明版权归 microsoft 所有

1:判断窗口最小化最大化状态
       最小化到任务栏使用IsIconic()函数判断
       最大化通过IsZoomed()函数判断
       GetWindowPlacement(),调用此函数可以获取窗口的正常状态,最大化,最小化。通过WINDOWPLACEMENT结构体进行判断。

2:一个应用程序只有一个实例


       1 :使用 FindWindow 函数,如果发现指定创建已经存在,就退出
              FindWindow 第一个参数为查找窗口的类名。
              FindWindow 第二个参数为查找窗口的标题名(最好选择这个)
       2 :使用 Mutex 互斥体
       // Create mutex, because there cannot be 2 instances for same application


     HANDLE hMutex = CreateMutex(NULL, FALSE, "ugg");


     // Check if mutex is created succesfully


     switch(GetLastError())


     {


     case ERROR_SUCCESS:


         // Mutex created successfully. There is no instance running


         break;


    case ERROR_ALREADY_EXISTS:


         // Mutex already exists so there is a running instance of our app.


         return FALSE;


     default:


         // Failed to create mutex by unknown reason


         return FALSE;


     }

3:改变窗口或者控件大小和移动窗口或者控件位置

    1MoveWindow函数,改变窗口的大小和位置

CRect rc;
GetClientRect(&rc);
m_Button.MoveWindow(0, 0, rc.Width(), rc.Height());

2SetWindowPos函数,可以应用Z轴方向上,改变重叠控件的显示次序。
            void CWinApp::HideApplication()
{
   //m_pMainWnd is the main application window, a member of CWinApp
   ASSERT_VALID(m_pMainWnd);
   // hide the application's windows before closing all the documents
   m_pMainWnd->ShowWindow(SW_HIDE);
   m_pMainWnd->ShowOwnedPopups(FALSE);

 


   // put the window at the bottom of z-order, so it isn't activated
   m_pMainWnd->SetWindowPos(&CWnd::wndBottom, 0, 0, 0, 0,
      SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
}

4:改变窗口的最大化最小化正常状态

      1SetWindowPlacement函数
    设置窗口最大化最小化显示状态,通过WINDOWPLACEMENT结构体进行设置
       2POSTSend这三种SC_MAXIMIZESC_MINIMIZESC_RESTORE命令消息


       PostMessage(WM_SYSCOMMAND, SC_MAXIMIZE,0 );// 最大化


       PostMessage(WM_SYSCOMMAND, SC_ MINIMIZE,0 );// 最小化


       PostMessage(WM_SYSCOMMAND, SC_RESTORE,0 );// 正常

5:更改窗口或者控件的注册类名

在默认的情况下,MFC的窗口或者控件的注册类名是MFC自动生成,比如Dialog的注册类名为”#32770”,CButton的注册类名为”Button”等,在一些hook应用中,我们可能需要修改这些注册类名。可以采用如下方法
重载窗口或者控件的PreCreateWindows函数,在函数内做如下修改

       BOOL CMyDilaolg::PreCreateWindow(CREATESTRUCT& cs)

{


WNDCLASS wndcls;


       ZeroMemory( &wndcls, sizeof(WNDCLASS) );

 


       wndcls.style = CS_DBLCLKS;


       wndcls.lpfnWndProc = AfxWndProc;


       wndcls.hInstance = AfxGetInstanceHandle();


       wndcls.hIcon = AfxGetApp()->LoadIcon( IDI_APPLICATION );


       wndcls.hCursor = AfxGetApp()->LoadStandardCursor( IDC_ARROW );


       wndcls.hbrBackground = NULL;


       wndcls.lpszMenuName = NULL;


       wndcls.lpszClassName = _T("uggDialog");


     


       AfxRegisterClass( &wndcls );


     


       cs.lpszClass = wndcls.lpszClassName; // 设置控件的注册类名


       return CDialog::PreCreateWindow( cs );


}

目录
相关文章
|
数据安全/隐私保护
|
存储 开发工具
陈伟视频-WindowsAPI和DLL(37-40)
陈伟视频-WindowsAPI和DLL(37-40)
|
编译器 C语言 Windows
问题集锦:Windows下使用CMake编译cocos2d-x
问题集锦:Windows下使用CMake编译cocos2d-x
345 0