• DIrectX的windows编程基础


    今天想看看Direct10的,却发现自己连最基本的Windows程序都忘了是怎样的..于是照着书码了一遍代码,顺便贴到博客上来,提醒自己..

    下面是一个简单的Windows应用程序。

    #include <windows.h>
    
    
    HWND myWinWnd = 0;
    
    
    bool iniWinApp(HINSTANCE instanceHandle,int nshow);
    int run();
    LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);
    
    
    /*第一个参数为该程序的实例句柄,一个程序可以有多个实例,就是我们常说的“多开”,用于操作系统对实例程序的识别..第二个参数是十六位操作系统遗留的问题
    可以不用理。第三个参数是程序启动时传入命令行参数的字符串,第四个参数指定窗口的现实方式比如默认SW_SHOW,最大化SW_SHOWMAXIMIZED,最小化*/
    int WINAPI WinMain(HINSTANCE instanceHandle,HINSTANCE prehinstance,PSTR pCmdLine,int nShowCmd)
    {
    
        /*iniwinApp函数完成初始化及创建窗口的过程,传入程序的实例句柄,及窗口的显示方式*/
        if(!iniWinApp(instanceHandle,nShowCmd))
        {
            MessageBox(0,L"iniWinApp fail",0,MB_OK);
            return 0;//error
        }
    
        return run();
    }
    
    bool iniWinApp(HINSTANCE instanceHandle,int nShow)
    {
    
        //////////////////////////////////////////////////////////////////////////
        ///填充WNDCLASS信息
    
        WNDCLASS wc;//调查下具体成员
    
        //CS_VREDRAW 当窗口水平方向的宽度变化时重绘整个窗口
        //CS_HREDRAW 当窗口水平方向的宽度变化时重绘整个窗口
        wc.style = CS_HREDRAW | CS_VREDRAW;
    
    
        //该窗口类所使用的消息回调函数,一个回调函数可以给不同的窗口类使用,不同的窗口类也可以使用一个回调函数
        wc.lpfnWndProc = WndProc;
    
        //表示窗口类结构和实例话之后,额外分配的字符。一般设为0
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
    
    
        wc.hInstance = instanceHandle;
    
        //图标与鼠标
        wc.hIcon = LoadIcon(0,IDI_APPLICATION);
        wc.hCursor = LoadCursor(0,IDC_ARROW);
    
        //用于指定窗口客户区背景色
        wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    
    
        //用于指定窗口菜单,这里设为0表示没菜单
        wc.lpszMenuName = 0;
    
        //该窗口类的名字
        wc.lpszClassName = L"diyige";
    
    
        //////////////////////////////////////////////////////////////////////////
        ///注册wc
    
        if(!RegisterClass(&wc))
        {
            MessageBox(0,L"registerClass fail",0,MB_OK);
            return false;//error
    
        }
    
        //////////////////////////////////////////////////////////////////////////
        ///creat 和显示 windows
    
        //creatwindow函数调用成功后将返回对应一个创建好的窗口的窗口句柄,创建失败返回0(窗口句柄就像是窗口的标识符一样。)
        myWinWnd = CreateWindow(
            L"diyige",//已经注册好的窗口类的名字
            L"第一个",//窗口标题
            WS_OVERLAPPEDWINDOW,//窗口式样,这个是比较经典的
            CW_USEDEFAULT,//窗口左上角X的坐标,CW_USEDEFAULT表示由系统自己决定
            CW_USEDEFAULT,//y
            CW_USEDEFAULT,//窗口宽度(单是像素)
            CW_USEDEFAULT,//窗口高度
            0,//当前窗口父窗口的句柄,因为没有所以填0
            0,//菜单的句柄,因为这个窗口没菜单所以是0
            instanceHandle,//与窗口关联的应用程序实例句柄
            0);
    
    
        if(myWinWnd == 0)
        {
            MessageBox(0,L"creatwindow fail",0,0);
            return false;
        }
        ShowWindow(myWinWnd,nShow);
        UpdateWindow(myWinWnd);
    
        return true;
    }
    
    int run()
    {
    
        //msg 是用于表示Windows消息的结构体
        /*Windows消息内容有:接收消息的窗口的句柄,特定消息的预定义常量值(如WM_QUIT),与该消息一起的附加信息,消息被加入消息队列的时间
        消息被送入消息队列时鼠标在屏幕的位置。更多相见MSG结构体的定义*/
        MSG msg = {0};
    
    
        bool bRet = 1;
    
        while((bRet = GetMessage(&msg,0,0,0)) != 0) 
        {
            if(bRet == -1)
            {
                MessageBox(0,L"GetMessage fail",0,MB_OK);
                break;
            }
            else
            {
                TranslateMessage(&msg);//用于键盘信息的转换,虚拟键盘码转化为字符信息
                DispatchMessage(&msg);//将消息传送给特定的消息处理函数
            }
        }
        
        return (int)msg.wParam;
    }
    
    //消息回调函数,由操作系统调用
    LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
        switch(msg)
        {
        case WM_LBUTTONDOWN:
            MessageBox(0,L"WM_LBUTTONDOWN clicked",0,MB_OK);
            return 0;
        case WM_KEYDOWN:
            if(wParam == VK_ESCAPE)
                DestroyWindow(hwnd);
            else
                MessageBox(0,L"a key has been pressed",0,MB_OK);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    
        }
    
        return DefWindowProc(hwnd,msg,wParam,lParam);
    }

    下面是程序的修改版,改动的是消息循环中Getmessage换成Peekmessage,Peekmessage比较实用与Direct这种经常更新响应的程序。详细的区别一搜索就可以找到很多的。新的run函数如下

    int run()
    {
    
        //msg 是用于表示Windows消息的结构体
        /*Windows消息内容有:接收消息的窗口的句柄,特定消息的预定义常量值(如WM_QUIT),与该消息一起的附加信息,消息被加入消息队列的时间
        消息被送入消息队列时鼠标在屏幕的位置。更多相见MSG结构体的定义*/
        MSG msg = {0};
    
        while(msg.message != WM_QUIT) 
        {
            if(PeekMessage(&msg,0,0,0,PM_REMOVE))
            {
                TranslateMessage(&msg);//用于键盘信息的转换,虚拟键盘码转化为字符信息
                DispatchMessage(&msg);//将消息传送给特定的消息处理函数
            }
            else
            {
                //do something
            }
        }
        return (int)msg.wParam;
    }
  • 相关阅读:
    堆排序
    深入理解创建类设计模式(Creational Patterns)
    (Head First)设计模式基础
    SpringMVC中的适配器模式应用
    软工团队任务
    visio画UML用例图
    安卓架构设计
    结对项目编程之代码进展
    工大助手(爬虫——查成绩部分)
    设计模式
  • 原文地址:https://www.cnblogs.com/CAION/p/2876795.html
Copyright © 2020-2023  润新知