9搂,10楼的帖子已经回答了8楼的提问。 handle 为什么翻译为句柄,我不得而知,我认为这个蹩脚的翻译是造成理解困难的一个原因。将它翻译为操作识别比较可以理解,但缺少了文采。但句柄这个单词却让我无法揣摩其意思。
我的个人观点,放弃句柄这个单词。那个最初翻译的人给大家制造了困难。其实很多东西没有必要翻译成中文。handle 就是 handle.
自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
Win32 Application - Step 1 of 1
1. An empty project 只生成四个文件(live41.dsp、live41.dsw、live41.ncb、live41.opt)和一个空文件夹Debug。
2.A simple Win32 Application 除了生成上面的四个文件和文件夹外,还有ReadMe.txt、StdAfx.cpp、StdAfx.h、live41.cpp。
3.A typical "Hello World!" application 除了1、2包含的,还有资源文件live41.rc,图标文件live41.ico,还有live41.html、live41.h、resource.h、small.ico。
以上是生成三个选项的区别,其中live41是你的工程名。
[此贴子已经被作者于2004-10-01 12:36:35编辑过]
周六,周日,都登录不上,接下来几天自己忙,没登录,所以让大家久等了。
下面是第二个程序:
大家先打开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); }
GDI(Graphics Device Interface 图形设备接口 ), 也就是说,他们是一些接口程序,这些程序的存在使得windows 应用程序的与设备无关性成为可能。
一个很重要的概念便是应用程序的设备无关性。我们知道计算机是由很多硬件,以及外设组成的。而软件是用来操作这些硬件的。独立于硬件的软件是没有的,也是没有意义的。但是由于硬件的多样性,使得软件编程产生了困难,因为如果软件要与硬件相关,那他必须考虑很多情况,对潜在的硬件的可能都必须考虑,这对于编程员来讲困难就太大了,于是有了这样一个想法,接口程序与外设对话,而我们只要在程序中应用接口程序就可以了,这样我们就不需要去考虑外设的多样性,这就是 windows 程序外设无关性。
下面来谈谈关于键盘与鼠标消息的响应,键盘与鼠标是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
具体程序下次给出
IrfanView is a grafisch Software, what is developed from Irfan.
see this link http://www.irfanview.com/
大家有兴趣先下载 IrfanView 这款看图软件,这是他完全个人开发的软件,Irfan 也是一位非常热情的程序员,与他不多的几次email 交流中,得知一些 该软件开发情况,考虑到商业机密,对软件开发的细节不做多谈也是可以理解的。不过他的建议也是 完全采用 winapi , 而非 MFC。
我们的项目开发的目标也是尽可能靠拢 IrfanView 的这款软件。