设为首页收藏本站

SKY外语、计算机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10006|回复: 3
打印 上一主题 下一主题

[C] vc6.0窗口HelloWorld源码分析

[复制链接]

6

主题

0

好友

272

积分

中级会员

Rank: 3Rank: 3

性别
保密

最佳新人 活跃会员 热心会员 灌水之王 论坛元老

跳转到指定楼层
楼主
发表于 2012-7-30 19:18:28 |只看该作者 |正序浏览
本帖最后由 sky_yx 于 2015-12-30 14:17 编辑

#include "stdafx.h"
#include "resource.h"
#define MAX_LOADSTRING 100                                                // 最大读取字符串
// 全局变量:
HINSTANCE hInst;                                                                // 当前实例
TCHAR szTitle[MAX_LOADSTRING];                                                                // 标题栏
TCHAR szWindowClass[MAX_LOADSTRING];                                                                // 窗口类名
// 函数声明:
ATOM                                MyRegisterClass(HINSTANCE hInstance);
BOOL                                InitInstance(HINSTANCE, int);
LRESULT CALLBACK        WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK        About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
         // TODO: 代码位置.
        MSG msg;
        HACCEL hAccelTable;
        // 初始化全局字符串
        LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
        LoadString(hInstance, IDC_ANALYSIS, szWindowClass, MAX_LOADSTRING); // 加载字串表资源
        MyRegisterClass(hInstance); // 注册窗口应用程序
        // 应用程序初始化:
        if (!InitInstance (hInstance, nCmdShow))
        {
                return FALSE;
        }
        hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_ANALYSIS); // 注册快捷键
        // 主消息循环:
        while (GetMessage(&msg, NULL, 0, 0)) // 获取消息,收到WM_QUIT消息时退出循环
        {
                if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))  // 将快捷键转换为按键消息,如果不是快捷键消息执行下面的语句
                {
                        TranslateMessage(&msg); // 将WM_KEYDOWN和WM_KEYUP消息转换成WM_CHAR消息放入消息队列
                        DispatchMessage(&msg); // 将消息发送到回调函数(WndProc)处理
                }
        }
        return msg.wParam; // 将退出消息返回给操作系统,从而退出,wParam的值是由PostQuitMessage的参数获得的
}
//
//  函数: MyRegisterClass()
//
//  目的: 注册窗口类.
//
//  注释:
//
//    此函数必须使用,如果你想要这段代码兼容
//    win32系统首先要知道'RegisterClassEx'函
//    数是在Windows 95之后添加的,调用这个函
//    数很重要,这样这个应用程序就会正确关联
//    小图标文件。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
        WNDCLASSEX wcex; // 窗口类结构体,用于注册窗口类
        wcex.cbSize = sizeof(WNDCLASSEX);  // 结构体大小
        wcex.style                        = CS_HREDRAW | CS_VREDRAW; // 窗口风格
        wcex.lpfnWndProc        = (WNDPROC)WndProc; // 窗口处理函数
        wcex.cbClsExtra                = 0; // 指定紧跟在窗口类结构后的附加字节数
        wcex.cbWndExtra                = 0; // 指定紧跟在窗口事例后的附加字节数
        wcex.hInstance                = hInstance; // 窗口实例句柄
        wcex.hIcon                        = LoadIcon(hInstance, (LPCTSTR)IDI_ANALYSIS); // 图标句柄
        wcex.hCursor                = LoadCursor(NULL, IDC_ARROW); // 光标句柄
        wcex.hbrBackground        = (HBRUSH)(COLOR_WINDOW+1); // 背景画刷句柄
        wcex.lpszMenuName        = (LPCSTR)IDC_ANALYSIS; // 菜单指针
        wcex.lpszClassName        = szWindowClass; // 指向窗口类名的指针,用于内部标识窗口
        wcex.hIconSm                = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); // 小图标
        return RegisterClassEx(&wcex); // 注册窗口类
}
//
//   函数: InitInstance(HANDLE, int)
//
//   目的: 保存实例句柄和创建主窗口
//
//   注释:
//
//        在这个函数中, 保存实例句柄到全局变量
//        创建和显示主窗口程序.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd; // 窗口句柄
   hInst = hInstance; // 在全局变量中存储实例句柄
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); // 创建窗口,风格WS_OVERLAPPEDWINDOW,初始坐标CW_USEDEFAULT,初始大小CW_USEDEFAULT,返回窗口句柄
   if (!hWnd)
   {
      return FALSE; // 如果创建失败,返回FALSE
   }
   ShowWindow(hWnd, nCmdShow); // 显示窗口
   UpdateWindow(hWnd); // 发送WM_PAINT消息,更新窗口
   return TRUE;
}
//
//  函数: WndProc(HWND, unsigned, WORD, LONG)
//
//  目的:  为主窗口处理消息.
//
//  WM_COMMAND        - 处理应用程序菜单
//  WM_PAINT        - 绘制主窗口
//  WM_DESTROY        - 发出一个退出消息然后返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        int wmId, wmEvent; // WM_COMMADN消息的菜单ID或子窗口的控件ID(低位)和通知码(高位)
        PAINTSTRUCT ps;
        HDC hdc; // 设备句柄
        TCHAR szHello[MAX_LOADSTRING];
        LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
        switch (message)
        {
                case WM_COMMAND: // 按键消息
                        wmId    = LOWORD(wParam);
                        wmEvent = HIWORD(wParam);
                        // 处理菜单项:
                        switch (wmId)
                        {
                                case IDM_ABOUT: // 菜单About被单击,执行下面的语句
                                   DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); // 创建对话框IDD_ABOUTBOX,父窗口为hWnd,处理过程About函数
                                   break;
                                case IDM_EXIT: // 菜单Exit被单击,执行下面的语句
                                   DestroyWindow(hWnd); // 销毁窗口
                                   break;
                                default: // 把无用的消息交给DefWindowProc处理
                                   return DefWindowProc(hWnd, message, wParam, lParam);
                        }
                        break;
                case WM_PAINT: // 重绘消息
                        hdc = BeginPaint(hWnd, &ps); // 获取设备句柄,为窗口进行绘图工作准备
                        // TODO: 绘图代码段
                        RECT rt; // 客户区右下角坐标
                        GetClientRect(hWnd, &rt); // 获取客户区坐标
                        DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER); // 在客户区写入szHello,DT_CENTER使内容水平居中
                        EndPaint(hWnd, &ps); // 结束绘画,释放设备句柄
                        break;
                case WM_DESTROY: // 关闭窗口消息
                        PostQuitMessage(0); // 发送WM_QUIT消息到消息循环
                        break;
                default: // 把无用的消息交给DefWindowProc处理
                        return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}
// 关于对话框处理函数.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch (message)
        {
                case WM_INITDIALOG: // 对话框创建完毕
                                return TRUE;
                case WM_COMMAND: // 按键消息
                        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) // 如果按键为IDOK或者IDCANCEL(关闭按钮)
                        {
                                EndDialog(hDlg, LOWORD(wParam)); // 结束对话框
                                return TRUE;
                        }
                        break;
        }
    return FALSE;
}

分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享淘帖0 收藏收藏0 评分评分

0

主题

0

好友

27

积分

新手上路

Rank: 1

性别
保密
地板
发表于 2013-6-16 20:44:12 |只看该作者
本帖最后由 sky_yx 于 2015-12-30 14:18 编辑

这个是最基本的windows程序运行流程,可以看看windows编程基础方面的书。照着书上的代码抄写一下,应该不会有错的,贴上来的程序有时会出现标点符号大小写以及敲错字母等问题导致报错

回复

使用道具 评分 举报

3

主题

1

好友

114

积分

注册会员

Rank: 2

自我介绍
胆小,诚实,对朋友认真,不喜欢说
生肖
星座
双子座
性别
保密

最佳新人

板凳
发表于 2013-6-10 02:07:35 |只看该作者
本帖最后由 sky_yx 于 2015-12-30 14:17 编辑

怎么出错啊?

有什么不知道的地方 可以来yy 4350 哦!那里高手很多。
回复

使用道具 评分 举报

1

主题

0

好友

158

积分

注册会员

Rank: 2

性别
保密

最佳新人 活跃会员 灌水之王

沙发
发表于 2012-8-1 11:11:26 |只看该作者
本帖最后由 sky_yx 于 2015-12-30 14:17 编辑

好深奥 看不懂!!!

回复

使用道具 评分 举报

您需要登录后才可以回帖 登录 | 立即注册


手机版|SKY外语计算机学习 ( 粤ICP备12031577 )    

GMT+8, 2024-12-22 21:40 , Processed in 0.132961 second(s), 27 queries .

回顶部