一个C语言的小问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个C语言的小问题相关的知识,希望对你有一定的参考价值。
我们学的C语言程序都是在DOS下运行的,怎么样使C语言编写的程序有windows的界面啊?
啊!这么复杂!dareny 我还有很多看不懂的.看来我还要学习C语言的其他函数,还要多写了,非常感谢你!除了等级考试那些知识,学习其它函数有什么书可以看吗?dareny能给我你的联系方法吗?再一次感谢你!
WINDOWS的窗口风格是怎么来的啦!
============================================
创建窗口
到目前为止,你已经看到了几个不同的 Windows 程序,但你还没有看到一个真正的窗口。搭起一个窗口的操作也有三步处理过程。只要编写一次这样程序,在以后的许多不同程序中就都可以重复使用,几乎完全不需要做任何修改。
下面你可以看到一个 50 行的短程序(程序清单 2.1),我用它建立了一个真正的窗口,它能完成你期望一个窗口能完成的动作。在这个阶段,你没有必要理解它,只要知道它大概是如何工作的,也不必为其中的任何细节而烦心。你先按程序清单 2.1 将程序建立起来并运行它,你就会看到这些代码所做的全部事情,也就是一个真正的 Windows 程序所做的事情。这就是说,你可以把窗口最大化、最小化或改变它的尺寸,这些正是任何专业的 Windows 程序所应具备的功能。
程序清单 2.1 为 MakeWin 程序,该程序建立了一个传统的窗口,它有一个标题、边界和系统菜单。
程序清单 2.1 MakeWin 程序
// Program MakeWin.cpp
#define STRICT
#include<windows.h>
#include<windowsx.h>
#include<string.h>
char Name[]="MakeWin";
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
#pragma warning (disable:4068)
#pragma argsused
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInstance,
LPSTR lpszCmdParam,int nCmdShow)
HWND hwnd;
MSG Msg;
WNDCLASS WndClass;
memset(&WndClass,0,sizeof(WNDCLASS));
WndClass.style = CS_HREDRAW|CS_VREDRAW;
WndClass.lpfnWndProc = WndProc;
WndClass.hInstance = hInst;
WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
WndClass.lpszClassName = Name;
RegisterClass(&WndClass);
hwnd = CreateWindow(Name,Name,WS_OVERLAPPEDWINDOW,
10,10,600,400,NULL,NULL,hInst,NULL);
ShowWindow(hwnd,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)
if(Message==WM_DESTROY)
PostQuitMessage(0);
return 0;
return DefWindowProc(hwnd,Message,wParam,lParam);
MakeWin 程序包含两个主要部分:
1. WinMain 函数
2. WndProc 函数
WinMain 函数可分为三个部分:
第一部分(18 到 24 行)用来指明窗口在哪儿注册:
18: memset(&WndClass,0,sizeof(WNDCLASS));
19: WndClass.style = CS_HREDRAW|CS_VREDRAW;
20: WndClass.lpfnWndProc = WndProc;
21: WndClass.hInstance = hInst;
22: WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
23: WndClass.lpszClassName = Name;
24: RegisterClass(&WndClass);
Register 过程告诉 Windows 一个窗口类的有关特性。但目前你还是暂时不要关心为什么要这样做以及每一步的用途。你只需知道,这是典型的 WinMain 过程要做的第一件事。在下一章中注册一个复杂动作将被分隔成独立的一个过程。
第二部分(26 到 30 行)是创建窗口:
26: hwnd = CreateWindow(Name,Name,WS_OVERLAPPEDWINDOW,
27: 10,10,600,400,NULL,NULL,hInst,NULL);
28:
29: ShowWindow(hwnd,nCmdShow);
30: UpdateWindow(hwnd);
创建一个窗口分成两步,第一步是调用 CreateWindow 函数(第 26、27 行),第二步分别 ShowWindow 函数(第 29 行)和 UpdateWindow(第 30 行)。创建一个窗口的动作如同注册窗口过程一样,通常也处理成一个单独的过程,这样做是为了分解一个复杂的问题并建立一个良好的结构化的健壮的程序。但现在我把所以的这些事情放在一起是为了让你感觉到政治家们常说的“大场面”。
WinMain 过程的第三部分是消息循环(32 到 36 行):
32: while(GetMessage(&Msg,NULL,0,0))
33:
34: TranslateMessage(&Msg);
35: DispatchMessage(&Msg);
36:
当用户移动鼠标或按键时,消息就被发送给消息循环,这相当于一个 Windows 程序的“驾驶员座位”,是命令中心,一个循环保持着一个程序生命的重复性经历。
到此为止,如果你还没弄懂什么,也不必焦急。本章最后这一段的目的只是简单地给你一个经典的 Windows 程序的概貌,下一章你会了解到你所期望知道的细节。
现在你只要记住这个明确的结论:一个 Windows 程序过程有三个基本部分:
1. 注册窗口
2. 创建窗口
3. 进入消息循环
这就像数 1,2,3 那样简单!
MakeWin 程序的另一个关键部分是 WndProc 过程,它响应程序收到的消息。
41: LRESULT CALLBACK WndProc(HWND hwnd,UINT Message,
42: WPARAM wParam,LPARAM lParam)
43:
44: if(Message==WM_DESTROY)
45:
46: PostQuitMessage(0);
47: return 0;
48:
49: return DefWindowProc(hwnd,Message,wParam,lParam);
50:
MakeWin 程序只直接响应 WM_DESTROY 消息(第 44 行),其它所有消息都转给 DefWindowProc 去处理。在下一章你会看到,DefWindowProc 过程只处理与窗口有关的默认行为。也就是说,当你要最大化一个窗口或最小化一个窗口时,DefWindowProc 过程会处理你发来的消息也知道该怎么处理。
但是 DefWindowProc 并不处理 WM_DESTROY 消息,这是程序员的职责。当消息来到时,只调用 PostQuitMessage(46 行)。这样做可以退出 WinProc,其返回值为 0(47 行)。
我知道,在读本章时有些读者对什么是消息,消息在 Windows 程序设计中的重要性不清楚。如果你是新手,不熟悉这个题材也不必着急。现在,只要接受这样一个事实:Windows 程序对消息是响应而不是中断。这与许多程序设计员的习惯不同,你会发现面向消息的操作系统具有非常简单而且精巧的设计。
在下一章中,你会看到如何用宏来处理标准的 Windows 消息,所以你可以把消息响应函数放在 WndProc 之外。这如同把 Create 和 Register 函数移到 WinMain 过程之外一样。这样,使得 Windows 程序设计人员能够建立结构良好的程序,这种程序便于维护和调试。这里我把这些过程放回到 WinMain 和 WndProc 函数中是使得你能看到一个典型的 Windows 程序的全貌。
至此,对 MakeWin 程序你只需知道这些,让我们总结一下:
·程序中有两个主要过程:WinMain 过程和 WndProc 过程。
·WinMain 过程有三个部分:首先注册窗口,然后创建窗口,最后是通过一个循环把消息发送给窗口。
·发送给窗口的任何消息都通过 WndProc 传送。Window 过程可以直接处理消息或将消息传递给 DefWindowProc 函数,它是默认消息处理器。事实上,某些程序首先由它自己处理消息,然后再将它传给 DefWindowProc 作进一步的处理。
这就是现阶段你需要了解的有关一个 Windows 程序的全部内容。关键是要掌握一个典型的 Windows 应用程序的整个流程,在你的头脑中对全局有清晰的概念,这样在学习下一章时才能弄清细节。
参考资料:www.hqoline.cn
参考技术A 呵呵 你一定是初学的吧 和我当年一样啊其实C语言本身对于我们在Windows下的话是编不出界面的,
你可以选择一种开发工具 比如VC++ 我估计你就在用那个了 编界面要用Windows 的API函数 这些函数本身不属于C语言,属于SDK
你可以看一下MFC的书 参考技术B 用C++编宜器吧~~~
要不用
这个吧
http://www.onlinedown.net/soft/30053.htm 参考技术C 要不想复杂的学Windons编程,也可以学习C++,C#等啊.
3楼的是用C语言编写的Windons程序..微软专门搞了一个Windons下的C编程.比较复杂,不适合初学者,要想学会Windons下的C编程,首先你要懂C语言,再者要理解Windons系统....Windons系统的核心就是消息机制.
虽然复杂,但是你能够通过Windons下的C编程获得一些低层的东西.可以直接调用Windons系统库函数.要知道Windons系统本身也要用自己的库函数来运行的哦. 参考技术D 呵呵 找到C语言的快捷图标 查看属性 里面有选项(窗口运行) 改一下就行了 我用的是TC2.0 不知道你的是不是 第5个回答 2007-10-18 C++
我的小问题
新学软件工程,以前很向往一个软件的编辑过程,总是期待着什么时候一个人人都用的软件上面写了我的名字。现在终于可以接触软件开发的整个过程,并自身参与其中,内心也是非常激动的。对于软件的开发,还有很多问题。首先,软件开发所用的语言,c、c++都是学校里教的,写过的代码不超过1000行,而且写的都是没有任何界面的小玩意。c#、java还没学,一直想自学,但总是没能下手。如果自己要开发一个软件,我是不是还得去复习以前的c、c++还是需要重新学习一门新的语言。这是我最大的疑惑。在这半个学期,真的能快速上手这门语言并实际开发软件吗?其次,软件开发的工具,老师说了github,但是我以前也经常去github上找过代码,却并不知道怎么用它来运行代码,期待老师能跟我们简要说下这个怎么用?最后就是考研的同学,这个学期任务量很重,如果还要去做软件工程的软件开发的话,毕竟对于编程语言的生疏,要想实际开发软件,应该不是一朝一夕能够成功的
以上是关于一个C语言的小问题的主要内容,如果未能解决你的问题,请参考以下文章