| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6359 人关注过本帖
标题:All about windows programming
取消只看楼主 加入收藏
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
结帖率:100%
收藏
 问题点数:0 回复次数:39 
All about windows programming

下面就让我们开始,请朋友们不要贴任何非技术性跟贴。

今天,让我们从 windows program 的基本框架开始。在这里所有程序的编译环境为VC 6.0 ,这里也不涉及 MFC 的讨论。 让我们用纯粹的 win32 Api 来编写 windows 应用程序。

首先打开 VC, -> File -> New... -> 选择Projects 选项 -> 加亮 Win32 Application -> 输入你想输入的Project name, 比如我们这里输入WindowsDemo -> 选择 Create new workspace (通常已经选好 )-> Platforms:选择win32 (通常已经选好 )-> 按下 ok 按钮 -> 在接下来的对话框为Win32 Application - Step 1 of 1, 我们选择 an empty project -> 按下 finish 按钮 -> 弹出新的对话框 New Project Information, 我们按下 ok 按钮

再次回到菜单栏,按下File -> New... -> 在Files 下,加亮 C++ Source File -> 在File name: 下输入你想要的文件名,比如我们这里输入 WindowsDemo , 如果你不人为确定文件格式,它将默认为C++ 文件,即 cpp 文件,如果你一定想让文件为C 文件,就需要人为输入文件结尾 .C, 我们这里采用 C++ 文件格式,因为C++ 兼容C, 而C并不兼容C++ 。请注意,add to project 旁边的那个打勾已经勾上了,如果没有,请勾上。-> 按下 ok 按钮

这样,我们看到了3个区域,右边最大的那个区域为工作区域,那儿,我们将输入我们的代码,右边那个区域我称它为文件区域,最下面的为信息区域,将显示一些编译的信息。

下面我们来将代码输入到工作区域。

以下为代码:

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { HWND hwnd; MSG Msg; WNDCLASS wndclass; char lpszClassName [] = "Windows"; char lpszTitle [] = "Windows Demo";

wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hInstance = hInstance; wndclass.lpfnWndProc = WndProc; wndclass.lpszClassName = lpszClassName; wndclass.lpszMenuName = NULL; wndclass.style = 0;

if(!RegisterClass(&wndclass)) { return 0; }

hwnd = CreateWindow(lpszClassName, lpszTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nShowCmd); UpdateWindow(hwnd); while(GetMessage(&Msg, NULL, 0, 0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; }

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_DESTROY: PostQuitMessage(0); default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }

Ctrl+F7 编译

F7 生成 exe 文件

Ctrl+F5 运行程序

你将看到我们的第一个简单的 windows program

搜索更多相关主题的帖子: programming windows All 
2004-08-25 07:10
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

live41, 以下回答你2楼的问题:nShowCmd 是 WinMain 的一个形参变量,这个变量在 ShowWindow(hwnd, nShowCmd); 中将被用到,只要保持一致就可以了。如果你在函数中使用nCmdShow, 而在WinMain 函数中定义nShowCmd, 这样就出现前后不一致,所以出现,错误信息,说你有变量没有定义。

至于你说的用其他模式,我觉得没必要,现在就这样按部就班的作吧。

我不打算,一次搞太多,这样很可能就会有朋友没有耐心跟着做了。我打算每次只是让大家往前走一小步,这样大家会有浓厚的兴趣的。

live41, 你放心,我会继续下去的,每星期我都会给出一个完整的代码,最终我们来做实际的项目。

第一段程序只是 windows 程序的框架程序,大家什么也没看到,不过以后在此基础上,慢慢增加代码,就可实现月来越多的内容。

第二个程序代码将在周六贴出。


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-08-27 02:10
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

kuangjingbo,

你5楼意见我认为可取,这是显而易见的,由于本程序就一个case, 另外一个为default case, 所以不会有任何不正常情况出现。


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-08-27 02:17
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

9搂,10楼的帖子已经回答了8楼的提问。 handle 为什么翻译为句柄,我不得而知,我认为这个蹩脚的翻译是造成理解困难的一个原因。将它翻译为操作识别比较可以理解,但缺少了文采。但句柄这个单词却让我无法揣摩其意思。

我的个人观点,放弃句柄这个单词。那个最初翻译的人给大家制造了困难。其实很多东西没有必要翻译成中文。handle 就是 handle.


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-08-28 01:42
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

周六,周日,都登录不上,接下来几天自己忙,没登录,所以让大家久等了。

下面是第二个程序:

大家先打开VC,找到上一个程序的目录,点击 *。dsp. 就可以打开上一个程序,拷贝下面这个程序,再全选当前打开的程序,然后ctrl+v, 就将拷贝的程序粘贴上去了。这个程序主要阐述一些 GDI Api,

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { HWND hwnd; MSG Msg; WNDCLASS wndclass; char lpszClassName [] = "Windows"; char lpszTitle [] = "Windows Demo";

wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hInstance = hInstance; wndclass.lpfnWndProc = WndProc; wndclass.lpszClassName = lpszClassName; wndclass.lpszMenuName = NULL; wndclass.style = CS_HREDRAW | CS_VREDRAW;

if(!RegisterClass(&wndclass)) { return 0; }

hwnd = CreateWindow(lpszClassName, lpszTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nShowCmd); UpdateWindow(hwnd); while(GetMessage(&Msg, NULL, 0, 0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; }

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static POINT aptFigure[10] ={10,70, 50,70, 50,10, 90,10, 90,50, 30,50, 30,90, 70,90, 70,30, 10,30}; static int cxClient, cyClient; HDC hdc; int i; PAINTSTRUCT ps; POINT apt[10]; // 换算为运用区域

switch(message) { case WM_SIZE: cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps);

SelectObject(hdc, GetStockObject(GRAY_BRUSH)); for(i = 0; i<10; i++) { apt[i].x = cxClient * aptFigure[i].x / 200; apt[i].y = cyClient * aptFigure[i].y / 100; }

SetPolyFillMode(hdc, ALTERNATE); Polygon(hdc, apt, 10);

for(i = 0; i<10; i++) { apt[i].x += cxClient / 2; }

SetPolyFillMode(hdc, WINDING); Polygon(hdc, apt, 10);

EndPaint(hwnd, &ps); return 0;

case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-09-02 04:16
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

GDI(Graphics Device Interface 图形设备接口 ), 也就是说,他们是一些接口程序,这些程序的存在使得windows 应用程序的与设备无关性成为可能。

一个很重要的概念便是应用程序的设备无关性。我们知道计算机是由很多硬件,以及外设组成的。而软件是用来操作这些硬件的。独立于硬件的软件是没有的,也是没有意义的。但是由于硬件的多样性,使得软件编程产生了困难,因为如果软件要与硬件相关,那他必须考虑很多情况,对潜在的硬件的可能都必须考虑,这对于编程员来讲困难就太大了,于是有了这样一个想法,接口程序与外设对话,而我们只要在程序中应用接口程序就可以了,这样我们就不需要去考虑外设的多样性,这就是 windows 程序外设无关性。


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-09-08 03:00
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

下面来谈谈关于键盘与鼠标消息的响应,键盘与鼠标是windows 程序中必定会碰到的话题,关于文字也将在这次的程序中略微带过。

分别来讲键盘与鼠标,先来讲键盘。下面是编程的一些背景知识:

当用户按下或释放一个键时,到底发生了什么呢?或者说应用程序如何来响应的呢?

首先,当用户按下或释放一个键时,键盘 KEZBOARD.DRV 中的键盘中断处理程序对所击键进行编码,并调用windows 的用户模块 USER。EXE中的有关程序来生成键盘消息,最终发送到应用程序的消息队列中等待处理,而处理这些消息则是由应用程序的窗口过程来具体完成的。

键盘上的每个键都对应一个扫描码,它是依赖于具体设备的,是唯一的标识值。应用程序是与设备无关的,所以应用程序处理的是虚拟码,虚拟码与扫描码有一一对应的关系,虚拟码是由windows 系统定义的与设备无关的键的唯一标识。当我们敲击键盘时,设备驱动程序在截取键的扫描码后把它转换为虚拟码,所以键盘的输入,将产生一条消息,它含有扫描码,虚拟码以及与击键有关的消息,设备驱动程序把这些消息放到系统的消息队列中去, windows 从系统消息队列中取出这条消息,再把它发送到相应的线程消息队列中去,最后由窗口过程从线程消息队列中取出键盘消息,进行后续处理。

虚拟码作为与设备无关的键盘编码,他的值存放在键盘消息的 wParam 参数中,用以标识哪个键被按下或释放。

常用虚拟码如: VK_0 ~ VK_9 (0~9) VK_A~VK_Z (A~Z) VK_LEFT 左箭头键。。。 等等,相关虚拟码我这里不一一列出了,大家可以网上查 MSDN

windows 支持两种字符集:OEM 和 ANSI. OEM是IBM 字符集,windows 提供了几个用于转换这两种字符集的函数,如: AnsiToOem 将ANSI 字符串转化为 OEM 字符串

AnsiToOemBuff 将缓冲区中的 ANSI 字符串转化为 OEM字符串

OemToAnsi

OemToAnsiBuff

具体程序下次给出


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-09-08 04:28
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

IrfanView is a grafisch Software, what is developed from Irfan.

see this link http://www.irfanview.com/

大家有兴趣先下载 IrfanView 这款看图软件,这是他完全个人开发的软件,Irfan 也是一位非常热情的程序员,与他不多的几次email 交流中,得知一些 该软件开发情况,考虑到商业机密,对软件开发的细节不做多谈也是可以理解的。不过他的建议也是 完全采用 winapi , 而非 MFC。

我们的项目开发的目标也是尽可能靠拢 IrfanView 的这款软件。


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-09-08 05:03
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

我不知道这里如何上传文件,要不然可以将我个人写的一个简单看图应用程序发上来。

如果朋友有兴趣,可以向我索取。


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-09-08 05:16
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

9编辑了几次,后面一段还是斜体,或许这是程序不能运行的原因。所以我干脆完全删掉了。改为上传这个 cpp 文件。

[attach]904[/attach]

[此贴子已经被作者于2004-10-03 16:18:25编辑过]


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-09-14 00:12
快速回复:All about windows programming
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019387 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved