03day-pm

  2.3、窗口类的相关函数
    RegisterClass/RegisterClassEx注册
    UnregisterClass 注销
    GetClassInfo/GetClassInfoEx 获取信息
    GetClassName 获取窗口的窗口类名称
    GetClassLong/SetClassLong 附加数据的设置
    GetWindowLong/SetWindowLong 窗口的附加数据
  2.4、创建窗口时如何定位窗口类
    2.4.1、查找应用程序局部的窗口类。如果找到,
        执行2.4.2,否则执行2.4.3.
    2.4.2、如果找到名称一致的窗口类,
        比较HINSTANCE句柄。如果一致,就使用找到的窗口类信息创建窗口,如果不同,继续查找,执行2.4.3。
    2.4.3、如果未找到名称一致的窗口类,会继续
        在应用程序全局窗口类中查找。如果找到执行2.4.4,否则2.4.5.
    2.4.4、全局窗口类找到一致的,使用找到的窗口类信息创建窗口。
    2.4.5、系统全局窗口类中查找。如果找到,创建窗口,否则返回失败。

3、窗口创建
  3.1、窗口创建函数
      CreateWindow/CreateWindowEx
      HWND CreateWindowEx(
            DWORD dwExStyle,//窗口的扩展样式
            LPCTSTR lpClassName, // pointer to registered class name
            LPCTSTR lpWindowName, // pointer to window name
            DWORD dwStyle, // window style
            int x, // horizontal position of window
            int y, // vertical position of window
            int nWidth, // window width
            int nHeight, // window height
            HWND hWndParent, // handle to parent or owner window
            HMENU hMenu, // handle to menu, or child-window identifier
            HINSTANCE hInstance, // handle to application instance
            LPVOID lpParam ); // pointer to window-creation data

      如果一个工作区里有多个项目,要想激活某个项目,就右键这个项目,选择set as active

  3.2、窗口风格和扩展风格
    窗口风格:WS_XXXX定义的风格,是窗口的基本风格。
    扩展风格:WS_EX_XXXXX 定义的风格,是窗口的扩展风格。
    比如:ToolWindow窗口等等。
    在CreateWindow可以使用基本窗口风格,扩展的窗口风格,需要使用CreateWindowEx设置。

    WS_OVERLAPED 窗口,层叠式窗口。
    WS_POPUP 窗口,弹出式窗口。
    WS_CHILD 窗口,子窗口。

  3.3、父窗口和子窗口
    3.3.1、CreateWindow时,指定父窗口。
    3.3.2、将窗口的风格增加WS_CHILD。
    3.3.3、可以使用SetParent和GetParent函数设置和获取指定窗口的父窗口。

        其他:MoveWindow移动窗口。

//创建子窗口
#include <Windows.h>

HINSTANCE g_hInst = NULL;
// 父窗口的处理函数
LRESULT CALLBACK WndProc( HWND hWnd,
                          UINT nMsg,
                          WPARAM wParam,
                          LPARAM lParam )
{
    switch( nMsg )
    {
    case WM_DESTROY:
        PostQuitMessage( 0 );
        return 0;
    }
    return DefWindowProc( hWnd, nMsg,
        wParam, lParam );
}
//子窗口的处理函数
LRESULT CALLBACK ChildProc( HWND hWnd,
                            UINT nMsg,
                            WPARAM wParam,
                            LPARAM lParam )
{
    return DefWindowProc( hWnd, nMsg,
        wParam, lParam );
}
//消息处理函数
void Message( )
{
    MSG msg = { 0 };
    while( GetMessage( &msg, NULL, 0, 0 ) )
    {
        DispatchMessage( &msg );
    }
}
//显示窗口
void DisplayWnd( HWND hWnd )
{
    ShowWindow( hWnd, SW_SHOW );
    UpdateWindow( hWnd );
}
//创建窗口
HWND CreateWnd( LPSTR pszClassName,
                DWORD nStyle,
                HWND  hParent )
{
    HWND hWnd = CreateWindowEx(
        0,
        pszClassName,
        "MyWnd",
        nStyle,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        hParent,NULL,g_hInst,NULL );
    return hWnd;
}
//注册窗口
BOOL RegisterWnd( LPSTR      pszClassName,
                  WNDPROC proc,
                  int     nBrush )
{
    WNDCLASSEX wce = { 0 };
    wce.cbSize      = sizeof( wce );
    wce.style       = CS_HREDRAW|CS_VREDRAW;
    wce.cbClsExtra  = 0;
    wce.cbWndExtra  = 0;
    wce.lpfnWndProc = proc;
    wce.hIcon        = NULL;
    wce.hCursor     = NULL;
    wce.hbrBackground = HBRUSH( nBrush );
    wce.hInstance     = g_hInst;
    wce.lpszClassName = pszClassName;
    wce.lpszMenuName  = NULL;
    wce.hIconSm       = NULL;
    ATOM nAtom = RegisterClassEx( &wce );
    if( 0 == nAtom )
    {
        return FALSE;
    }
    return TRUE;
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    g_hInst = hInstance;
    //注册父窗口类
    RegisterWnd( "MyWnd", WndProc,
        COLOR_BTNFACE+1 );
    //注册子窗口类
    RegisterWnd( "Child", ChildProc,
        COLOR_WINDOW );
    //创建父窗口
    HWND hWnd = CreateWnd( "MyWnd",
        WS_OVERLAPPEDWINDOW, NULL );
    //创建子窗口
    HWND hChild1 = CreateWnd( "Child",
        WS_CHILD|WS_VISIBLE|WS_BORDER|
        WS_THICKFRAME|WS_CAPTION|WS_SYSMENU|
        WS_MINIMIZEBOX|WS_MAXIMIZEBOX,
        hWnd );
    HWND hChild2 = CreateWnd( "Child",
        WS_VISIBLE|WS_POPUP|
        WS_THICKFRAME|WS_CAPTION|WS_SYSMENU,
        hWnd );
    HWND hChild3 = CreateWnd( "Child",
        WS_CHILD|WS_VISIBLE|WS_BORDER,
        hWnd );
    //移动窗口位置
    MoveWindow( hChild1, 100, 100,
        200, 200, TRUE );
    MoveWindow( hChild2, 200, 200,
        200, 200, TRUE );
    MoveWindow( hChild3, 300, 300,
        200, 200, TRUE );
    //显示父窗口
    DisplayWnd( hWnd );
    Message( );
    return 0;
}

  3.4 MDI多文档窗口的创建
    3.4.1 创建主窗口
      注册主窗口类型,创建主窗口.
      HWND hWnd = CreateWindowEx( 0,
                pszClassName, "MainWnd",
                WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
                CW_USEDEFAULT, CW_USEDEFAULT,
                CW_USEDEFAULT, NULL, NULL, g_hInst,
                NULL );

    3.4.2 MDICLIENT窗口
      1 添加CLIENTCREATESTRUCT结构,作为附加数据
        CLIENTCREATESTRUCT cs = { 0 };
        cs.idFirstChild = 1000;//MDI第一个子窗口的ID
      2 创建时,使用"MDICLIENT"窗口类型.
      3 它的父窗口是主窗口
          HWND hWnd = CreateWindowEx( 0,
                    "MDICLIENT", "MainWnd",
                    WS_CHILD|WS_VISIBLE, CW_USEDEFAULT,
                    CW_USEDEFAULT, CW_USEDEFAULT,
                    CW_USEDEFAULT, hParent, NULL, g_hInst,
                    &cs );

    3.4.3 创建一个MDI子窗口
      1 注册主窗口类型,创建子窗口
      2 它的父窗口为MDICLIENT窗口
      3 增加WS_EX_MDICHILD的风格
        HWND hWnd = CreateWindowEx( WS_EX_MDICHILD,
                        pszClassName, "ChildWnd",
                        WS_CHILD|WS_VISIBLE, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, hParent, NULL,
                        g_hInst, NULL );

#include <Windows.h>
HINSTANCE g_hInst = NULL;
HWND g_hMDIClient = NULL;

//主窗口的窗口处理函数
LRESULT CALLBACK MainProc(HWND hWnd,
                            UINT nMsg,
                            WPARAM wParam,
                            LPARAM lParam)
{
    switch(nMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }

    return DefFrameProc(hWnd,g_hMDIClient,nMsg,wParam,lParam);
}

//子窗口的窗口处理函数
LRESULT CALLBACK ChildProc(
                        HWND hWnd,
                        UINT nMsg,
                        WPARAM wParam,
                        LPARAM lParam)
{

    return DefMDIChildProc(hWnd, nMsg, wParam, lParam);
}

//窗口注册函数
BOOL RegisterWnd(LPSTR pszClassName,
                    WNDPROC Proc,
                    int nBrush)
{
    WNDCLASSEX wce = {0};
    wce.cbSize = sizeof(wce);
    wce.style = CS_HREDRAW|CS_VREDRAW;
    wce.cbClsExtra = 0;
    wce.cbWndExtra = 0;
    wce.lpfnWndProc = Proc;
    wce.hInstance = g_hInst;
    wce.hCursor = NULL;
    wce.hIcon = NULL;
    wce.hbrBackground = HBRUSH(nBrush);
    wce.lpszClassName = pszClassName;
    wce.lpszMenuName = NULL;
    wce.hIconSm = NULL;
    ATOM nAtom = RegisterClassEx(&wce);
    if(nAtom == 0)
    {
        return FALSE;
    }

    return TRUE;
}

//显示窗口
void DisplayWnd(HWND hWnd)
{
    ShowWindow(hWnd,SW_SHOW);
    UpdateWindow(hWnd);
}

//消息循环
void Message()
{
    MSG msg = {0};
    while(GetMessage(&msg,NULL,0,0))
    {
        DispatchMessage(&msg);
    }
}

//创建主窗口的函数
HWND CreateMainWnd(LPSTR pszClassName)
{
    HWND hWnd = CreateWindowEx(0,
                        pszClassName, "MainWnd",
                        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
                        CW_USEDEFAULT,CW_USEDEFAULT,
                        CW_USEDEFAULT,NULL,NULL,g_hInst,NULL);
    return hWnd;
}

HWND CreateMDIClient(HWND hParent)
{
    CLIENTCREATESTRUCT cs = {0};
    cs.idFirstChild = 1000;
    HWND hWnd = CreateWindowEx(0,
                        "MDICLIENT", "MainWnd",
                        WS_CHILD|WS_VISIBLE, CW_USEDEFAULT,
                        CW_USEDEFAULT,CW_USEDEFAULT,
                        CW_USEDEFAULT,hParent,NULL,g_hInst,
                        &cs);
    return hWnd;
}

HWND CreateClildWnd(LPSTR pszClassName,
                    HWND hParent)
{
            HWND hWnd = CreateWindowEx(WS_EX_MDICHILD,
                        pszClassName, "ChildWnd",
                        WS_CHILD|WS_VISIBLE, CW_USEDEFAULT,
                        CW_USEDEFAULT,CW_USEDEFAULT,
                        CW_USEDEFAULT,hParent,NULL,g_hInst,
                        NULL);
            return hWnd;
}

int WINAPI WinMain(
                HINSTANCE hInstance,
                HINSTANCE hPrevInstance,
                LPSTR lpCmdLine,
                int nCmdLine)
{
    //注册主窗口
    RegisterWnd("MainWnd",MainProc,COLOR_BTNFACE+1);
    //注册子窗口
    RegisterWnd("ChildWnd",ChildProc,COLOR_WINDOW);
    //创建主窗口
    HWND hMain = CreateMainWnd("MainWnd");
    //创建MDICLIENT窗口
    //创建MDICLIENT子窗口
    g_hMDIClient = CreateMDIClient(hMain);
    MoveWindow(g_hMDIClient, 0, 0, 500, 500, TRUE);
    //显示和消息处理
    //创建MDI子窗口
    HWND hChild = CreateClildWnd("ChildWnd",g_hMDIClient);
    DisplayWnd(hMain);
    Message();

    return 0;
}
时间: 2024-10-14 16:16:33

03day-pm的相关文章

临摹PM百科写的一个页面

1.效果图 HTML: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>PM百科</title> <link type="text/css" rel="stylesheet" href="css/style.css"> </he

can&#39;t locate ExtUtils/MakeMaker.pm in @INC

[[email protected] FCGI-0.71]# perl Makefile.PL can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: /usr/local/lib/perl5 /usr/local/share/perl5 /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5 /usr/share/perl5 .) at Makef

关于PM(项目经理)的思考和课后问题解答

这次我要说明的是关于两个关于PM的问题.这里的PM专指我们的软件项目经理,所以这次我们需要从一个更高的角度去看这个问题,假设你可以作为一个团队的领导者和你的团队一同进行软件的设计,同时还需要完成在开发阶段一系列的问题. 好了现在有一个问题摆在我们的面前:一个用户把他的需求交给你去实现,但是你在联系的过程中发现你联系的”客户” 不是真的客户, 而是转手把他接到的活转包给你了,但是你见不到用户,你只跟转包的二道贩子交流. 面对这样的情形我们是否还是要接手呢?首先我们的身份是一个项目的经理,我们的首要

Android下pm 命令详解

Sam在看相关PackageManager代码时,无意中发现Android 下提供一个pm命令,通常放在/system/bin/下.这个命令与Package有关,且非常实用.所以研究之.0. Usage: usage: pm [list|path|install|uninstall] pm list packages [-f] pm list permission-groups pm list permissions [-g] [-f] [-d] [-u] [GROUP] pm list ins

PM Boook项目管理思维导图梳理

采用思维导图的形式来展示项目管理的五大过程组.十大知识领域,能更好的展示框架结构,便于理解.分析. 下图为思维导图化制的项目管理要素:灰色为启动过程组.白色为规划过程组.紫色为执行过程组.蓝色为监控过程组.绿色为收尾过程组. PM Book(第五版),项目管理框架结构更清晰,把干系人管理单独作为一个章节,其他章节梳理的更清晰,推荐参考第五版.

假如BOSS给了PM一个不靠谱的需求

假如BOSS给了一个PM不靠谱的需求,那么站在PM的角度上,我会怎么处理呢?在知乎上看了好多达人以及同行的真知灼见,自己也是有一番小的思考,这里做一个总结吧 其实,这种不靠谱的产生的最主要的原因无非是所处的位置和立场不同,因而会发出不同的声音. 作为一个BOSS,更可能是从当前整个市场的行情,走向去看问题,觉得我们应该做一个XXX产品,实现XXX需求,然后达到XXX目标. 作为一个PM,更多的是考虑一个产品满足这种需求所需要的成本,实现细节以及"性价比",如果PM再厉害点的话,可能技术

Can&#39;t locate XML/Simple.pm in @INC (@INC contains: /opt/local/lib

苹果电脑上使用perl发现下面这个错误: Can't locate XML/Simple.pm in @INC (@INC contains: /opt/local/lib 解决方法: sudo cpan install XML::Simple 这个安装时间有点长. Can't locate XML/Simple.pm in @INC (@INC contains: /opt/local/lib

Arduino + SmartAirFilter 制作智能感应的 PM 空气净化器

先说 SmartAirFilters 知道 SmartAirFilters 源自微博上转发的非常火的那个帖子,和动辄七八千元的商用产品比,几百元的 SmartAirFilters(下面简称电扇) 确实不贵.一次和朋友在清华科技园里附近的咖啡馆聊天,正好遇见他们在那里做 DIY 体验工坊,作为 DIYer 爱好者,理所应当给个赞,就败了个 1.0 试一试. 空气 PM 的监控 空气过滤效果究竟怎样?作为数据控,理所应当必须看数据说话.正好在玩 Arduino Yun,就起意搞个灰尘传感器监控一下.

微软职位内部推荐-Senior PM

微软近期Open的职位: Sr.PM for Whole Page Experience- Search Technology Center Asia Location:Beijing/Suzhou Group Overview As part of the Microsoft Bing team, the Search Technology Center Asia (STCA) is working to deliver innovative Internet search products

&lt;23:34 pm&gt;

今天幸运地在宿舍登上了学校的网,正在看一个自己觉得很有意思的电影——<社交网络>.讲的就是facebook的创立,或者说是一个关于马克·扎克伯格的传记电影.但是感觉今天看不完了,现在已经11:40 pm了,明天还要上学..不能睡太晚,不然还会像今天一样,开始偏头疼. 头疼不是病,疼起来真要命啊!疼了一天,都没法思考了, 回到家开始昏天黑地地睡觉,4:00 pm的时候才醒,发现好多了,于是背着书包又来了学校. 宿舍的几个哥们还在聊天..什么苏联的解体,又什么美国的亚太再平衡战略,大晚上的不睡觉聊