今天想看看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;
}

 

 

posted on 2013-01-25 15:53  曾健  阅读(315)  评论(0编辑  收藏  举报