zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Leetcode 538. Convert BST to Greater Tree
    Leetcode 530. Minimum Absolute Difference in BST
    Leetcode 501. Find Mode in Binary Search Tree
    Leetcode 437. Path Sum III
    Leetcode 404. Sum of Left Leaves
    Leetcode 257. Binary Tree Paths
    Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
    Leetcode 226. Invert Binary Tree
    Leetcode 112. Path Sum
    Leetcode 111. Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/CAION/p/2876795.html
Copyright © 2011-2022 走看看