孙鑫 "第一个Windows程序" 的VS2005版

本文提供了一个在VC.NET2005环境下编译通过的窗口程序示例,介绍了如何创建窗口、响应鼠标点击等操作,并对与VC6的不同之处进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<windows.h>
#include<stdio.h>

WCHAR _szAppName[]=L"JohnTwo";
WCHAR _szTitle[]=L"MyfirstWindow";
LRESULT CALLBACK WinProc(HWND hwnd,
                         UINT uMsg,
                         WPARAM wParam,
                         LPARAM lParam
                         );

//WinMain函数与CallBack函数一样,一般由系统调用,如同c里的main函数
int WINAPI WinMain(HINSTANCE hInstance,//调用时系统分配
                   HINSTANCE hPrevInstance,//在目前状态下无用
                   LPSTR lpCmdLine,        //由调用者传入
                   int nCmdShow        //由调用者指定
                   )       
{                           
    WNDCLASS wc;
    wc.cbClsExtra=0;
    wc.cbWndExtra=0;
    wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//GetStockObject是用来获取对象句柄,这里是白色画刷的句柄
    wc.hCursor=LoadCursor(NULL,IDC_CROSS);
    wc.hIcon=LoadIcon(NULL,IDI_ERROR);
    wc.hInstance=hInstance;
    wc.lpfnWndProc=WinProc;//指向窗口过程函数
    wc.lpszClassName=_szAppName;
    wc.lpszMenuName=NULL;
    wc.style=CS_HREDRAW | CS_VREDRAW;//在垂直和水平方向发生变化时重绘
    //以上定义一个窗口结构完成
    RegisterClass(&wc);

    //创建窗口
    HWND hwnd;
    hwnd=CreateWindow(
        _szAppName,//lpClassName
        _szTitle,//lpWindowName
        WS_OVERLAPPEDWINDOW,//dwStyle,创建的窗口样式
        CW_USEDEFAULT,        //x起始点
        CW_USEDEFAULT,        //y起始点
        600,    //宽
        400,    //高
        NULL,    //hWndParent,无
        NULL,    //hMenu,菜单也无
        hInstance,
        NULL    //这里无附加消息
    );

    //显示及刷新窗口
    ShowWindow(hwnd,SW_SHOWNORMAL);
    UpdateWindow(hwnd);

    //定义消息结构,开始循环
    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return static_cast<int>(msg.wParam);//由于.net支持std C++,所以要求比较严格
}

LRESULT CALLBACK WinProc(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
)
{
    switch(uMsg)
    {
    case WM_CHAR:
        WCHAR szChar[20];
        swprintf(szChar,20,L"char code is %d", wParam);//注意了,这都是unicode环境
        MessageBox(hwnd,szChar,TEXT("char"),0);
        break;
    case WM_LBUTTONDOWN:
        MessageBox(hwnd,TEXT("mouse clicked"),TEXT("message"),0);
        HDC hdc;        //定义一支笔
        hdc=GetDC(hwnd);//拿起画板
        TextOut(hdc,0,50,TEXT("我真正的第一个程序"),(int)wcslen(L"我真正的第一个程序"));//画画
        ReleaseDC(hwnd,hdc);//放下画板
        break;
    case WM_PAINT:
        HDC hDC;
        PAINTSTRUCT ps;
        hDC=BeginPaint(hwnd,&ps);
        TextOut(hDC,0,0,TEXT("MyfirstApp"),(int)wcslen(L"MyfirstApp"));
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE:
        if(IDYES==MessageBox(hwnd,TEXT("是否真的结束?"),TEXT("message"),MB_YESNO))
        {
            DestroyWindow(hwnd);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd,uMsg,wParam,lParam);
    }
    return 0;
}

 

  我周遭有不少朋友用孙鑫的书,但又用VC.NET2005版的开发环境学习,遇到不少困扰。这里推出一个该程序的VC.NET2005版本给大家 作参考。这个程序在VC.NET2005下编译通过,无错误、无警告。程序中多处使用了显示转换,严格来讲,应该用static_cast< typename>,我并没有全部这样,很多地方就用老式的转换方法,直接在需要转换的对象前添加一个“(new typename)”。最严格的、支持标准C++的编译器,或许会对此提出警告。不过VC.NET并不介意如此做。

  另外,总结一下 二者的不同。大家最常碰到的恐怕是没有用“TEXT()”来处理常量字符串,导致蹦出一堆警告。其实,即便在VC6下,TEXT()也是被推荐的使用方法 (参看"Windows程序设计"第五版),而在VC.NET下,全面UNICODE化,更是如此。其它的一些主要的改动,也是由于UNICODE化引起 的,包括使用swprintf,WCHAR, wcslen等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值