VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 364|回复: 8
打印 上一主题 下一主题

[转载] 关于WinMain如何创建一个标准窗口,消息循环等问题

[复制链接]
96_avatar_middle
跳转到指定楼层
1#
在线会员 发表于 2019-9-13 16:35:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


学习了两个月时间C++Win32编程发布一些对Win32图形窗口程序学习心得



第一次发帖可能有一些地方表达没有很清楚,请大家谅解,别喷我关于WinMain如何创建一个标准窗口,消息循环等问题
原贴:https://www.cnblogs.com/hnfxs/p/3834908.html
大家可以把原贴的代码复制粘贴在自己的工程中试试能否编译通过再复制下面的代码,希望对大家学习c++编程有一定帮助
其中的一些代码稍做了一下修改,解决了一些编译错误。不知道怎么创建项目的可以参考下面的
打开vs2010(本人用的是VS2010)->选择VC++项目新建一个Win32Application->选Windows应用程序,勾选空项目->完成




//*******************************************************************

// 工程:easywin

// 文件:easywin.cpp

// 内容:一个基本的Win32程序

//回顾一些知识,syc老师教的_T()函数只能在MFC程序中使用,_TEXT()就是Win32程序的_T()

//还有关于

//*******************************************************************

#include <windows.h>
#include <windowsx.h>

//函数声明

BOOL InitWindow( HINSTANCE hInstance, int nCmdShow );

LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam,

        LPARAM lParam );

//*******************************************************************

//函数:WinMain()

//功能:Win32应用程序入口函数。创建主窗口,处理消息循环

//*******************************************************************

int PASCAL WinMain( HINSTANCE hInstance, //当前实例句柄

        HINSTANCE hPrevInstance, //前一个实例句柄

        LPSTR lpCmdLine, //命令行字符

        int nCmdShow) //窗口显示方式

{

        MSG msg;

        //创建主窗口

        if ( !InitWindow( hInstance, nCmdShow ) )

                return FALSE;

        //进入消息循环:

        //从该应用程序的消息队列中检取消息,送到消息处理过程,

        //当检取到WM_QUIT消息时,退出消息循环。

        while (GetMessage(&msg, NULL, 0, 0))

        {

                TranslateMessage(&msg);

                DispatchMessage(&msg);

        }

        //程序结束

        return msg.wParam;

}

//******************************************************************

//函数:InitWindow()

//功能:创建窗口。

//******************************************************************

static BOOL InitWindow( HINSTANCE hInstance, int nCmdShow )

{

        HWND hwnd; //窗口句柄

        WNDCLASS wc; //窗口类结构

        //填充窗口类结构

        wc.style = CS_VREDRAW | CS_HREDRAW;

        wc.lpfnWndProc = (WNDPROC)WinProc;

        wc.cbClsExtra = 0;

        wc.cbWndExtra = 0;

        wc.hInstance = hInstance;

        wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );

        wc.hCursor = LoadCursor( NULL, IDC_ARROW );

        wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

        wc.lpszMenuName = NULL;

        wc.lpszClassName = TEXT("EasyWin");

        RegisterClass( &wc );          //注册窗口类

        hwnd = CreateWindow(        //创建主窗口

                TEXT("EasyWin"), //窗口类名称

                TEXT("一个基本的Win32程序"), //窗口标题

                WS_OVERLAPPEDWINDOW, //窗口风格,定义为普通型

                100, //窗口位置的x坐标

                100, //窗口位置的y坐标

                400, //窗口的宽度

                300, //窗口的高度

                NULL, //父窗口句柄

                NULL, //菜单句柄

                hInstance, //应用程序实例句柄

                NULL ); //窗口创建数据指针

        if( !hwnd ) return FALSE;

        //显示并更新窗口

        ShowWindow( hwnd, nCmdShow );

        UpdateWindow( hwnd );

        return TRUE;

}

//******************************************************************

//函数:WinProc()

//功能:处理主窗口消息

//******************************************************************

LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam,

        LPARAM lParam )

{

        switch( message )

        {

        case WM_KEYDOWN://击键消息

                switch( wParam )

                {

                case VK_ESCAPE:

                        MessageBox(hWnd,TEXT("ESC键按下了!"),TEXT("Keyboard"),MB_OK);

                        break;

                }

                break;

        case WM_RBUTTONDOWN://鼠标消息

                {

                        MessageBox(hWnd,TEXT("鼠标右键按下了!"),TEXT("Mouse"),MB_OK);

                        break;

                }

        case WM_PAINT://窗口重画消息

                {

                        wchar_t hellow[] = TEXT("hellow world!");                //此处修改了,原贴是定义一个char数组这里改为         wchar_t实际就是定义了一个宽字节的char数组

                        HDC hdc;

                        PAINTSTRUCT ps;

                        hdc=BeginPaint( hWnd,&ps ); //取得设备环境句柄

                        SetTextColor(hdc, RGB(0,0,255)); //设置文字颜色

                        TextOut( hdc, 20, 10, hellow, wcslen(hellow));//输出文字                                
                                //这里也修改了一下因为TextOut()这个函数第四个参数需要的是一个宽字节char *数组所以就在上面修改了一下过编译,另外wcslen()相当于是strlen()只是宽字节版本的
                        EndPaint( hWnd, &ps ); //释放资源

                        break;

                }

        case WM_DESTROY://退出消息

                PostQuitMessage( 0 );//调用退出函数

                break;

        }

        //调用缺省消息处理过程

        return DefWindowProc(hWnd, message, wParam, lParam);

}


剩下的内容大家可以查看原贴,帮助大家对Win32图形窗口程序如何创建加深理解,觉得不错的请不要吝啬你的免费评论Thanks    贴一份源码:
游客,如果您要查看本帖隐藏内容请回复





上一篇:学习构造函数显示没声明的标示符memset
下一篇:USC2转ANSI怎么转
96_avatar_middle
2#
ico_lz  楼主| 发表于 2019-9-13 19:30:45 | 只看该作者
这里纠一个错误在Win32程序中转换通用字符应该是TEXT(),在MFC程序中默认定义的_T(),只是在Win32函数中可以用户自己用宏定义
58_avatar_middle
3#
online_vip 发表于 2019-9-13 20:08:17 | 只看该作者
Err0r 发表于 2019-9-13 19:30
这里纠一个错误在Win32程序中转换通用字符应该是TEXT(),在MFC程序中默认定义的_T(),只是在Win32函数中可 ...

win32里就可以用_T(),TEXT()在Windows.h头文件中,_T()在tchar.h 头文件中。
96_avatar_middle
4#
ico_lz  楼主| 发表于 2019-9-13 23:54:45 | 只看该作者
敏敏 发表于 2019-9-13 20:08
win32里就可以用_T(),TEXT()在Windows.h头文件中,_T()在tchar.h 头文件中。

我还以为要宏定义呢,,哈哈哈
58_avatar_middle
5#
online_vip 发表于 2019-9-14 00:29:10 | 只看该作者
Err0r 发表于 2019-9-13 23:54
我还以为要宏定义呢,,哈哈哈

有不懂的先百度查查,不可以偷懒。
98_avatar_middle
6#
在线会员 发表于 2019-9-17 13:39:12 | 只看该作者
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
78_avatar_middle
7#
在线会员 发表于 2019-9-22 02:53:32 | 只看该作者
感谢分享感谢分享感谢分享感谢分享感谢分享感谢分享感谢分享感谢分享感谢分享感谢分享
84_avatar_middle
8#
在线会员 发表于 2019-9-22 17:28:12 | 只看该作者
感觉你没理解的是通用非通用字符,然后有些东西是通过宏定义实现的通用
30_avatar_middle
9#
在线会员 发表于 2019-9-24 23:53:42 | 只看该作者
        感谢楼主分享!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-10-10 01:30

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表
时时彩平台排名