| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6359 人关注过本帖
标题:All about windows programming
只看楼主 加入收藏
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

代码没有给出注释太过表面,看不懂,只把代码copy了不知道其中原理。 以下是第一次的代码,写了一点注释,还是很多不懂,请给多一点注释好吗?

#include <windows.h>

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

int APIENTRY WinMain(HINSTANCE hInstance, // handle to current instance // 句柄 to 当前的实例 HINSTANCE hPrevInstance, // handle to previous instance // 句柄 to 前一个实例 LPSTR lpCmdLine, // long pointer to command line // Cmd = command -> 命令

int nCmdShow) //确定程序窗口的显示方式,如最大化,最小化,隐藏等

// #define WINAPI __stdcall // #define APIENTRY WINAPI // => APIENTRY = WINAPI { 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); //GetStockObject函数检索预定义的备用笔、刷子、字体或者调色板的句柄 //函数原型: HGDIOBJ GetStockObject(int fnObject);

wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //函数原型: HCURSOR LoadCursor(HINSTANCE hlnstance, LPCTSTR lpCursorName);

wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //函数原型: HICON Loadlcon(HINSTANCE hlnstance, LPCTSTR lplconName);

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, nCmdShow); //函数原型: BOOL ShowWindow(HWND hWnd,int nCmdShow);

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); break; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }

[此贴子已经被作者于2004-10-03 11:50:10编辑过]

2004-09-09 23:31
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
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

这次来谈鼠标的应用,Windows 中通过光标来指示当前鼠标的位置, 在Windows操作系统中预定义了几种光标:

IDC_HAND 手型光标 IDC_ARROW 箭头光标 IDC_CROSS 十字光标 IDC_HELP 带有箭头和问号的光标 IDC_IBEAB I 型文本光标 IDC_ICON 空图标 IDC_SIZEALL 四个方向都有箭头的光标 IDC_SIZENESW 带有指向东北方和西南方箭头的光标 IDC_SIZENS 带有指向北方和南方的光标 IDC_SIZENWSE 带有指向西北方和东南方箭头的光标 IDC_SIZEWE 带有指向东方和西方箭头的光标 IDC_UPARROW 垂直箭头光标 IDC_WAIT 计时光标(沙漏光标)

用户也可以通过图形编辑器自定义光标形式,将其保存在扩展名为 .cur 的文件中,采用自定义光标时,需要在资源文件中定义光标资源,其形式为: 光标名 CURSOR 光标文件(.cur) 然后应用程序通过调用 LoadCursor 加载光标资源,其形式为:LoadCursor(hThisInst, lpszCursorname) 其中, hThisInst 为应用程序当前实例handle, lpszCursorname 为当前光标,应用程序加载光标资源常在定义窗口类时进行,例如,

WNDCLASS wndclass;

...

wndclass.hCursor = LoadCursor(hThisInst, IDC_SIZEALL);

...

此外,还可在应用程序中调用 LoadCursor 函数改变光标形式。

// next time continue


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

Windows操作系统通过鼠标 设备驱动程序 接受鼠标输入 。鼠标驱动程序在启动Windows时装入,Windows操作系统通过鼠标驱动程序能监测出鼠标是否存在。如果鼠标已经存在,则设备驱动程序将注意到Windows的任何鼠标事件。每当在窗口内有鼠标事件发生时,窗口就接受到一个鼠标事件(以消息的形式发送给应用程序的窗口)。

当应用程序的用户区内产生一个鼠标事件时,就将产生一个用户区鼠标消息。用户区常用的鼠标消息:

WM_LBUTTONDOWN 用户区内按下鼠标左键

WM_LBUTTONUP 用户区内松开鼠标左键

WM_LBUTTONDBLCLK 用户区内双击鼠标左键

WM_RBUTTONUP 用户区内松开鼠标右键

WM_RBUTTONDBLCLK 用户区内双击鼠标右键

WM_MOUSEMOVE 鼠标在用户区内移动

在鼠标消息中,通过用户区消息的 lParam 和 wParam 参数,程序员就可以确定鼠标的位置和鼠标键的状态。参数lParam 包含了以窗口的左上角为原点的坐标系鼠标位置,其低位包含了鼠标位置的 X 坐标值,高位包含了鼠标位置的 Y 坐标;参数wParam包含了一个指示各种虚键状态的值。wParam 参数是下表所列值的组合。

值 含义

MK_CONTROL 按下键盘上的Ctrl 键

MK_LBUTTON 按了鼠标左键,等同于WMO_LBUTTONDOWN

MK_RBUTTON 按了鼠标右键,等同于WMO_RBUTTONDOWN

MK_SHIFT 按下键盘上的Shift 键

当按下鼠标左键时同时监测 Shift 键和 Ctrl 键,一般用如下代码:

case WM_LBUTTONDOWN: // 按下鼠标左键

if((wParam & MK_CONTROL) && (wParam & MK_SHIFT)) // Shift 和Ctrl 键都被按下

...

break;

case WM_LBUTTONUP: // 释放鼠标左键

...

break;

....

对于鼠标双击,一般设定的双击时间间隔为0.5s, 这是Windows系统默认的时间间隔,当然,应用程序也可以调用 SetDoubleClickTime() 函数来重新设定此值,此外,若要使窗口函数能接受鼠标双击产生的消息,则在注册窗口类时必须注明窗口类具有 CS_DBLCLKS 属性,定义方式如下:

wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;

若窗口不包含上述属性的定义,那么即使进行了双击操作,该窗口也只能接受到两条单击消息。

每当在一个窗口的用户区以外的地方(例如在窗口的菜单,滚动条,工具条和标题条等处)产生了一个鼠标事件,就将产生一个非用户区鼠标消息,对于非用户区鼠标消息,往往不由应用程序进行具体处理,而是送往 DefWindowProc 函数进行处理。

通常情况下,只有当鼠标光标位于某一窗口的用户区时,该窗口的窗口函数才能接受到鼠标消息,但是由于鼠标移动的随机性,难以保证光标始终不离开某一个窗口,如果要使某一个窗口能不间断地捕获鼠标消息,就必须对鼠标加以捕获,此时可以调用 SetCapture() 函数实现对鼠标的捕获,如 SetCapture(hWnd); 这样可以使Windows发送的所有鼠标消息均定向到某一个窗口,而不管鼠标的光标处于何处。

一旦从窗口捕获了鼠标,系统的键盘功能就暂时失效,其他窗口也无法得到鼠标消息,因此,当该窗口不再需要捕获所有的鼠标消息时,应及时调用 ReleaseCapture() 函数释放鼠标,以便其他窗口可以正常地接受鼠标消息。

// Code next time, continue


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-09-24 00:50
skay
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2004-9-11
收藏
得分:0 

live41 版主阿,你发的那些文件我怎么不能看啊,谢谢你提示噢~~!~


我想笨鸟也会先飞!`````
2004-09-24 21:59
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

to skay: 你指哪个文件不能看?下载不了吗?

to kai: 可以的话请在代码中写注释而不是另起一贴介绍。

[此贴子已经被作者于2004-09-24 22:56:38编辑过]

2004-09-24 22:55
kuangjingbo
Rank: 1
等 级:新手上路
帖 子:312
专家分:0
注 册:2004-4-24
收藏
得分:0 
Charles Petzold 

永不放弃!
2004-09-25 21:22
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

#include <windows.h> #include <stdio.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 Key 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_SYSMENU, // 应用程序可以被关闭,通过点击大叉 50, 50, 450, 450, 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) { HDC hdc; PAINTSTRUCT ps; TEXTMETRIC tm; HBRUSH hbrush; HPEN hpen; HCURSOR hcursor; char str[15]; static int x, y;

switch(message) { case WM_MOUSEMOVE: x = LOWORD(lParam); y = HIWORD(lParam); if(x>50 && x<150 && y>50 && y<150) //设置十字光标显示区域 { hcursor = LoadCursor(NULL, IDC_CROSS); //装载十字光标 SetCursor(hcursor); } if(x>150 && x<250 && y>50 && y<150) { hcursor = LoadCursor(NULL, IDC_SIZEALL); SetCursor(hcursor); } if(x>250 && x<350 && y>50 && y<150) { hcursor = LoadCursor(NULL, IDC_SIZENESW); SetCursor(hcursor); } if(x>50 && x<150 && y>150 && y<250) { hcursor = LoadCursor(NULL, IDC_IBEAM); SetCursor(hcursor); } if(x>150 && x<250 && y>150 && y<250) { hcursor = LoadCursor(NULL, IDC_WAIT); SetCursor(hcursor); } if(x>250 && x<350 && y>150 && y<250) { hcursor = LoadCursor(NULL, IDC_UPARROW); SetCursor(hcursor); } if(x>50 && x<150 && y>250 && y<350) { hcursor = LoadCursor(NULL, IDC_SIZEWE); SetCursor(hcursor); } if(x>150 && x<250 && y>250 && y<350) { hcursor = LoadCursor(NULL, IDC_SIZENWSE); SetCursor(hcursor); } if(x>250 && x<350 && y>250 && y<350) { hcursor = LoadCursor(NULL, IDC_SIZENS); SetCursor(hcursor); } if(x>350 || y>350) { hcursor = LoadCursor(NULL, IDC_HELP); SetCursor(hcursor); } if(x<50 || y<50) { hcursor = LoadCursor(NULL, IDC_APPSTARTING); SetCursor(hcursor); } hdc = GetDC(hwnd); GetTextMetrics(hdc, &tm); hbrush = (HBRUSH)GetStockObject(WHITE_BRUSH); SelectObject(hdc, hbrush); hpen = (HPEN)GetStockObject(BLACK_PEN); SelectObject(hdc, hpen); Rectangle(hdc, 5, 5, tm.tmAveCharWidth*8, tm.tmHeight+3); sprintf(str, "%d, %d\0", x, y); TextOut(hdc, 5,5,str, lstrlen(str)); EndPaint(hwnd, &ps); break; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); hpen = (HPEN)GetStockObject(BLACK_PEN); SelectObject(hdc, hpen); Rectangle(hdc, 50,50,350,350); MoveToEx(hdc, 50,150,NULL); LineTo(hdc, 350,150); MoveToEx(hdc, 50,250,NULL); LineTo(hdc, 350,250); MoveToEx(hdc, 150,50,NULL); LineTo(hdc, 150,350); MoveToEx(hdc, 250,50,NULL); LineTo(hdc, 250,350); EndPaint(hwnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }


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

出于两个原因,我对这个帖的工作进行地极其缓慢。原因之一,保持慢速度使大家能有兴趣跟着做。其实学编程需要投入极大的激情,极大的耐心和极大的毅力。并不是你一时高兴来做几个兴趣题,来显示你比较聪明。我已经不再做那种趣味题了,做趣味题只是为了让你熟悉一门编程语言而已,当你对一门编程语言已经掌握,应该考虑如何去做项目,如何去做有操作界面的应用程序。也就是说,应该从阶段1 过渡到阶段2 了。在C语言板块有很多朋友对C语言已经掌握,甚至掌握的很好,可还是一味地把精力投入在趣味题编程上。我认为这是一种错误,windows 编程不是一件简单的工作,同样需要时间和精力的投入。如果把时间投入到学习 windows 编程上,那么1-2 年后你将有能力做出你自己的应用程序,而把精力投入在 趣味题上,1-2 后,你还是做不出任何东西。

原因之二,自己本人有学习和工作的压力,所以也就不能经常来,为此投入的时间就少了,如果朋友们觉得这个帖的进展较慢的话,那请见谅。


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

我们接下来要讨论是这么一个单词: 资源。在windows 编程中我们经常要听到这么一个单词,那就是资源。在编程中我们经常用到加速键,位图,对话框和菜单等对象,实际上,这些都是资源。这些资源可是使用VC6.0提供的资源编辑器来进行创建和编辑,也可以使用文本编译器进行编辑。资源是windows应用程序用户界面的重要组成部分。

下面我们来讲菜单与加速键资源

菜单实际上是一种资源,经常同加速键资源一同使用,使菜单操作更加方便。

菜单主要有窗口主菜单条,下拉式菜单框,菜单项热键标识,菜单项加速键标识和菜单项分隔线组成,此外,菜单项前常有选中标志以标识某菜单项是否被选中。

下面将通过以下4点,以及一个例程来讲解菜单资源。

1)菜单的创建过程

2)操作菜单项

3)动态创建菜单

4)加速键资源

具体讲解以上4点,下次继续。。。


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



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

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