 |
白乔原创:VC之美化界面篇
|
|
| |
| 本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础:
1. 大致了解MFC框架的基本运作原理;
2. 熟悉Windows消息机制,熟悉MFC的消息映射和反射机制;
3. 熟悉OOP理论和技术;
本文根据笔者多年的开发经验,并结合简单的例子一一展开,希望对读者有所帮助。
1. 美化界面之开题篇
相信使用过《金山毒霸》、《瑞星杀毒》软件的读者应该还记得它们的精美界面:
图1 瑞星杀毒软件的精美界面
程序的功能如何如何强大是一回事,它的用户界面则是另一回事。千万不要忽视程序的用户界面,因为它是给用户最初最直接的印象,丑陋的界面、不友好的风格肯定会影响用户对软件程序的使用。
“受之以鱼,不若授之以渔”,本教程并不会向你推荐《瑞星杀毒软件》精美界面的具体实现,而只是向你推荐一些常用的美化方法。
2. 美化界面之基础篇
美化界面需要先熟悉Windows下的绘图操作,并明白Windows的幕后绘图操作,才能有的放矢,知道哪些可以使用,知道哪些可以避免……
2.1 Windows下的绘图操作
熟悉DOS的读者可能就知道:DOS下面的图形操作很方便,进入图形模式,整个屏幕就是你的了,你希望在哪画个点,那个地方就会出现一个点,红的、或者黄的,随你的便。你也可以花点时间画个按钮,画个你自己的 ...
|
|
| 作者:不祥 bluejoe张贴于2004-03-04 15:11:18.0,共阅读56230次,回复41次 |
|
|
 |
如何定制对话框系统菜单
|
|
| |
| 系统菜单是每个 Windows 程序的标准特性。通常系统菜单由 Windows 系统来管理,所以我们平时编成时很少去碰它。但是,有的时候,我们确实想定制自己的系统菜单项。
这样就涉及到定制菜单的处理问题,因为 Windows 无法自动处理我们定制的系统菜单。而且,系统菜单的处理方式与常规的菜单处理是不同的。那么我们如何实现定制的系统菜单呢?相信看完本文的介绍,你会得到满意的答案。
本文例子是一个典型的C++/MFC对话框程序,设置了 EX_WM_TOOLWINDOW 扩展式样,因此在标题栏左上角看不到系统菜单图标,但通过 Ctrl+Space 或者在标题栏单击鼠标右键可以调出系统菜单。例子程序对系统菜单进行了定制,在原有菜单基础上添加了两个菜单命令:一个是显示“关于”对话框;另一个是“退出”。之所以要加一个“退出”菜单命令,是因为例子程序改写了对话框原来默认的“关闭”菜单命令行为(Alt-F4),用来隐藏对话框。因此必须加一个程序的“退出”出口。此外,例子程序利用一个第三方的系统托盘处理类,利用系统托盘图标可以显示/隐藏对话框。 下面我们就来看看用 C++/MFC 实现的细节。
添加菜单
首先在资源定义文件 resource.h 中定义菜单项标示,也可以在标准头文件中定义。
菜单项标示必须具有唯一性。其次,Windows 对系统菜单的处理与常规菜单的处理方法是不同 ...
|
|
| 作者:不祥 jerry张贴于2004-05-11 20:41:25.0,共阅读3285次,回复1次 |
|
|
 |
终于搞懂了,预编译头文件(precompiled header)
|
|
| |
| 预编译头文件今天在改一个很大的程序,慢慢看,慢慢改。突然发现一个.c文件,里面什么也没有,
就几个头文件,我一看,我靠,这不是把简单的问题搞复杂了吗,随手删掉那个c文件。
结果不能编译了,我靠:
fatal error C1083: Cannot open precompiled header file: \'Debug/v13_3.pch\':
No such file or directory
怎么rebuild all都不行。
上网查了一下,才搞懂了:
----------------总结------
如果工程很大,头文件很多,而有几个头文件又是经常要用的,那么
1。把这些头文件全部写到一个头文件里面去,比如写到preh.h
2。写一个preh.c,里面只一句话:#include "preh.h"
3。对于preh.c,在project setting里面设置creat precompiled headers,对于其他
.c文件,设置use precompiled header file
//
哈哈
我试了一下,效果很明显,不用precompiled header,编译一次我可以去上个厕所,用
precompiled header,编译的时候,我可以站起来伸个懒腰,活动活动就差不多啦
---------转载的 ...
|
|
| 作者:不祥 pyl2001张贴于2004-03-09 19:32:16.0,共阅读51972次,回复23次 |
|
|
 |
面向对象分析的最新思考
|
|
| |
| 面向对象分析,这个是c++的最基本的要求,也许刚学习c++的人都能很轻松的背出它的定义,但是在实际的编程过程中能很好的面向对象分析的是少之又少。我在做第一个项目的时候,在分析的时候就用面向对象的方法进行分析,可是很遗憾,由于我的编程水品的限制,不知不觉中陷入了对细节的纠缠,没能完全的面向对象。因此我很苦恼,后来我给自己总结了下,就不再强求自己面向对象了。这完全是对的,无论是谁都不可能到函数级别还面向对象,只能是随着理解的深入,面向对象的层次更高些罢了。但是要想使用这套混合的、非完美的面向对象分析,必须有一套完美的方法。 这套方法就是: 1.放弃面向对象。当你对某个领域不了解或者对某方面编程不熟悉的时候,就要放弃面向对象的方法,因为这个时候你必 须把精力放在如何解决问题上,首先要解决有无的问题。试想下,假如你对某个对象不了解,但还是一味的追求面向 对象,并把这个对象封装成一个类,这个时候这个类的属性、方法就十分缺少了,它与其它对象的关系就更不明了 了,这时候你写的程序只能是补丁程序,健壮性可想而知了。但是如果你放弃面向对象,使用分而治之的方法,也许 就一切问题都迎刃而解了,当然这里的放弃面向对象是指:我们不能把某个类抽象出来,但是我们能隐隐约约感觉 到,并不是一切混乱的写。 2.封装不熟悉的东西。对于不熟悉的函数、方法,不要拿来就用,要把它封装 ...
|
|
| 作者:流水 liushuiwu张贴于2009-12-08 09:53:39.0,共阅读311次,回复2次 |
|
|
 |
用DirectDraw编写动画程序
|
|
| |
| 一.理论篇 说起DirectDraw也许大多数人还不知其为何物,但一提到DirectX恐怕每一个Computer Fan 和Game Fan都再耳熟不过了。(什么!你没听说过DirectX!?Oh,My god!来人哪,拉下去重责五十大板!)DirectX又叫Game SDK,它最大的特点是直接对硬件的抽象层(HAL)进行操作,利用这个特点可以制作出高性能的Windows游戏。具体信息请见http://www. microsoft.com/directx/default.asp。 DirectDraw就是DirectX5的6个组件之一。DirectX5的其它5个组件分别是: Direct3D:提供了3D硬件接口。 DirectSound:立体声和3D声音效果,同时管理声卡的内存。 DirectPlay:支持开发多人网络游戏,并能处理游戏中网络之间的通信问题。 DirectInput:为大量的设备提供输入支持。 DirectSetup:自动安装DirectX驱动程序。 而DirectDraw则是DirectX的基石,DirectX的其它组件都是建立在它的基础之上的。DirectDraw使用页面切换的方法实现动画,它不仅可以访问系统内存,还可以访问显示内存,这是以往的Windows程序员所不能的。另外,我们利用DirectDraw还可以生成、移动、剪切、 ...
|
|
| 作者:不祥 jerry张贴于2004-06-11 09:48:45.0,共阅读4088次,回复2次 |
|
|
 |
如何真实地模拟火焰效果
|
|
| |
| 模拟火焰效果如何真实地模拟火焰效果
作者:周军
游戏制作离不开各种各样的特效,火焰效果更是这些特效当中最常用的一种。在网上有很多的这方面的例子,但似乎都不太理想。下面我主要介绍几种有效的火焰模拟算法。
在讲述火焰算法之前,我想先介绍一个经典的Blur算法,这将为我们后面的文章提供很好的技术基础,因为这是模拟火焰的关键所在。^_^ 对于不同的效果我们要采取不同的模糊(Blur)算法,在这里我只介绍最简单的一种。
其实Blur算法相当简单,并不像很多人想象的那么神秘,只要一句话就可以解释清楚。我们所要做的不过是把屏幕上的每一个点用它周围的四个点的平均值代替即可。即:
好了,下面我们进入主题,Let’ s get in …… FIRE ! ! !
总的来说,模拟一个火焰效果需要以下这三个步骤:放置热源、火焰上升、减掉衰减因子。
1. 放置热源:
放置热源很好理解,也很好实现,我们只需要在屏幕的适当位置(想升起火焰的地方)放上一些亮点就可以了,比如:
for (int i=0; i<320; i++)
putpixel (i, 199, rand()%256);
2. 火焰上升:
我们已经有了热源,那么如何使火焰升起来呢?这就要用到我们刚才讲到的Blur了。由于火焰是要向上升的,所以我们不能简单的选择待处理pixel的上、下 、左、右四个 ...
|
|
| 作者:不祥 xler张贴于2004-05-19 20:05:02.0,共阅读3834次,回复2次 |
|
|
 |
白乔原创:VC之控件篇[4]
|
|
| |
| 1 常见控件推荐
FlashPlayer程序至此打造完毕,以下向大家推荐一些比较有用的控件:
1.1 MsChart控件
控件名称:Microsoft Chart Control 6.0 (sp4)
控件类:CMsChart
控件简介:MsChart是微软制作的功能强大的图表工具,用它可以很方便的建立各种图表,包括各种二维、三维的饼图、折线图、直方图、折线图、面积图等。
应用图例:
图40 MsChart控件应用图例
1.2 DataGrid控件
控件名称:Microsoft DataGrid Control 6.0 (sp5)
控件类:CDataGrid
控件简介:DataGrid控件是由微软提供的数据表格控件,需要与ADODC控件配合使用。通过使用DataGrid控件,可以很方便地实现数据表记录的浏览、增加、删除和修改功能。
应用图例:
图41 DataGrid控件应用图例
1.3 MsComm控件
控件名称:Microsoft Communications Control version 6.0
控件类:CMsComm
控件简介:MSComm 控件提供了一系列标准通讯属性和方法,使用它可以建立起应用程序与串行端口的联接。
应用图例:
图42 MsComm控件应用图例
以上画面来源于笔者自行制作的手机通讯软件FreePhone ...
|
|
| 作者:不祥 bluejoe张贴于2004-04-15 23:13:17.0,共阅读16015次,回复6次 |
|
|
 |
编写易于调试的VC代码
|
|
| |
| 一 程序的设计 要避免错误,首先要从好的设计开始。对于程序的设计,需考虑到程序的两个特性: 1简单性 大多数常见的错误来源于程序设计中不必要的复杂成分。一个好的设计应该反映问题本身的要求,而不必为了刻意追求“满足将来的需要”而添加不必要的特性。实际上,简单优雅的设计比那些复杂的设计更能迎合未来的需求。 2 耦合性 耦合(decoupling)性用来衡量不同对象之间的依赖程度。松耦合的程序易于理解和实现,易于测试和维护,且这种程序包含错误的可能性小,错误也较容易发现和清除。
二 编程风格 编程风格是个人问题,有很大的随意性。一个好的编程风格不仅让代码易理解,也易于调试。好的编程风格包括: 1 清晰地书写代码 如果没有必要,尽量不要使用语言中的高级特性,因为这些特性不易于理解和调试。使用大多数程序员都能理解的语言成分来书写代码不易犯错且易于理解和维护。 2 编写结构良好的代码 当程序崩溃时所能得到的最基本的调试信息是源代码文件、问题所在行的行号和一个调用栈(call stack)。调用栈是调试程序时最有帮助的部分,它提供错误出现的上下文,也就是带参数的函数调用序列。你书写的代码结构越好,调用栈就能给你越多信息。 3 使用良好的标识符 一个好名字能使你的代码更容易被理解和维护。流行的匈牙利命名法(Hungarian Notation) ...
|
|
| 作者:michael bluejoe张贴于2007-01-23 17:00:05.0,共阅读4544次,回复9次 |
|
|
 |
白乔原创:艺术编程之C++篇
|
|
| |
| 0 引言
做“编程的学问”?这绝不是小题大做。中国的程序员有的是,但他们程序的质量往往并不能和他们的智商相提并论。中国有句老话叫“踏踏实实做事,认认真真做人”,本文不想提太多的时髦的软件工程理论,而只想就程序员的基本功——“编程”一一展开篇幅,让那些聪明的程序员从小事做起,从点点滴滴做起,写出更有用的程序。
本文着重讨论软件编程的艺术(“不要和我谈艺术”,谁说的?!),作为例子,本文将选取高结构化的C++语言作为实现语言。
本文部分内容参考《高质量程序设计指南——C++/C语言》(林锐 著)和Rational Unified Process文档《Java 编程指南》(Scott Ambler 著),感兴趣的读者可以和笔者联系。
0.1 何为“高质量的软件”——软件的质量属性
何为“高质量的软件”?一个功能性很强的软件并不一定高质量,同理,一个很厉害的程序员往往也不是“最好的”,“高处不胜寒”的程序员往往是最寂寞的,对于民族程序员群体来说,他们正如流星一样耀眼,但是他们也正如流星一样短暂、一样悲哀……
一个程序员的代码,不能为他人所读懂,不是一件光荣的事。这样的程序可读性也见一斑,更谈不上“高质量”了(可笑的是,总有这方面的“牛人”藉以自己“高深”的程序而自豪)。
软件的质量属性很多,以下是最突出的,也是最容易让人所理解的:
艺术性(artistry)。你 ...
|
|
| 作者:不祥 bluejoe张贴于2004-03-04 15:29:19.0,共阅读4543次,回复3次 |
|
|
 |
VC基础学习:初学者指针指南
|
|
| |
| 何为指针?
指针基本上和其它的变量一样,唯一的一点不同就是指针并不包含实际的数据,而是包含了一个指向内存位置的地址,你可以在这个地址找到某些信息。这是一个很重要的概念,并且许多程序或者思想都是将指针作为它们的设计基础,例如链表。
开始
如何定义一个指针?呃,就像定义其它的变量一样,不过你还需要在变量名之前添加一个星号。例如,下面的代码创建了两个指向整数的指针:
int* pNumberOne;
int* pNumberTwo;
注意到变量名的前缀“p”了吗?这是编写代码的一个习惯,用来表示这个变量是一个指针。
现在,让我们把这些指针指向一些实际的值吧:
pNumberOne = &some_number;
pNumberTwo = &some_other_number;
“&”标志应该读作“the address of(……的地址)”,它的作用是返回一个变量的内存地址,而不是这个变量本身。那么在这个例子中,pNumberOne就是some_number的地址,亦称作pNumberOne指向some_number。
现在,如果我们想使用some_number的地址的话,那么我们就可以使用pNumberOne了。如果我们希望经由pNumberOne而使用some_number的值的话,我们可以用*pNum ...
|
|
| 作者:不祥 try_yuyi张贴于2004-07-24 19:09:16.0,共阅读6900次,回复11次 |
|
|
 |
list队列与vector容器的用法
|
|
| |
| list用法 #include <list> using namespace std; struct DEVICEINFO { CString strPath; //路径 CString strDeviceName; //设备名称 }; //声明变量: list<DEVICEINFO> m_listDeviceInfo; //增加元素 DEVICEINFO info; info.strDeviceName = "10.13.5.100_5309"; info.strPath = "D:\\ZD_FILES\\1\\10.13.5.100_5309\\1@10.13.5.100_5309@20080701@105759.zd"; m_listDeviceInfo.push_back(info); info.strDeviceName = "10.13.5.100_5310"; info.strPath = "D:\\ZD_FILES\\1\\10.13.5.100_5310\\1@10.13.5.100_5310@20080701@105759.zd"; m_listDeviceInfo.push_back(info); //判断元素在list中 //例如DeviceName为10.13.5.100_5309 for(list<DEVICEINFO>::iterator it = m ...
|
|
| 作者:彭斯 pengsiqi1985张贴于2010-01-15 10:17:21.0,共阅读577次,回复0次 |
|
|
 |
C++源代码游戏编程--WinMain()函数集
|
|
| |
| C++源代码游戏编程--WinMain()函数集
C++源代码游戏编程--WinMain()函数交流
//******************************************************************
//函数:WinMain()
//功能:应用程序入口
//******************************************************************
int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
hInst=hInstance;
//初始化主窗口
if (!InitWindow( hInstance, nCmdShow))
return FALSE;
//初始化DirectDraw环境
if (!InitDDraw())
{
MessageBox(hWndMain, "初始化DirectDraw过程中出错!", "Error", MB_OK);
FreeObjects();
D ...
|
|
| 作者:不祥 guifang张贴于2004-06-20 11:46:28.0,共阅读8705次,回复5次 |
|
|
 |
白乔原创:VC之控件篇
|
|
| |
| 本文主要通过大量示例指引读者了解和使用Windows控件以及ActiveX控件。1 前言
1.1 控件之于VC
控件与Visual C++没有直接的关系,控件是Windows操作系统的界面元素,而VC只是一种开发语言。VC可以编写Windows程序,当然也可以编写Windows界面,包括最熟悉的对话框界面。
对话框界面是初学者学习VC的一道门槛,学习复杂的文档/视对于初学者来说是很痛苦的事情。而对话框的优点就在于它的“所见即所得”,设计界面画得有多好看,程序运行界面就有多好看。而如何让你的对话框的界面更丰富一点,那就是控件的事情了。
所以,你,责无旁贷的,要先学好控件的使用;而本次教程,正是指引你如何在VC里实现控件编程。
控件是窗口,是个完成特定功能的小窗口。例如:最熟悉的列表框控件可以让你用来列出你所有女友的名字;
控件放置在对话框里,对话框就成为控件的容器,或曰父窗口;而控件就成为对话框的元素,或曰子窗口。
控件并不总是显示成一个窗口,它可以是隐藏着的,例如:你可以使用定时器控件来控制“神五”的发射,但没必要一定要在发射系统的主界面上土土地画上一只小闹钟。
你用来选择女友名字的列表框是Windows系统标准控件,用来指示大爆竹升天的定时器也是。但Windows系统为你考虑的总会有限,那么就需要一些先行的人(第三方)为你准备一些他们出品的控件,这些符合Windo ...
|
|
| 作者:不祥 bluejoe张贴于2004-04-15 22:59:04.0,共阅读11817次,回复2次 |
|
|
 |
白乔原创:VC之控件篇[3]
|
|
| |
| 以上部分操纵的都是Windows标准控件,其实在Windows里,你还会常常接触到ActiveX控件,它来源于第三方,而非Windows操作系统。这样的控件一般来说,功能丰富而且使用方便,从而大大简化了程序员的工作。本章节以我们需要使用到的Flash控件为例细作阐述。 1 使用ActiveX控件
以上部分操纵的都是Windows标准控件,其实在Windows里,你还会常常接触到ActiveX控件,它来源于第三方,而非Windows操作系统。这样的控件一般来说,功能丰富而且使用方便,从而大大简化了程序员的工作。本章节以我们需要使用到的Flash控件为例细作阐述。
1.1 控件的注册
不同于Windows标准控件,ActiveX控件需要注册才能使用,ActiveX一般以.OCX或者.DLL文件格式发布,可以使用VC附带的工具来注册某个控件,按照以下步骤:
1. 在VC的Tools菜单下启动ActiveX Control Test Container;
2. 在ActiveX Control Test Container里打开菜单File\Register Controls…;
3. 弹出窗口Register Controls显示系统中已注册的所有ActiveX控件,点击左下角的“Register…”按钮;
4. 选择待注册的控件文件,如:“C:\WINNT\system3 ...
|
|
| 作者:不祥 bluejoe张贴于2004-04-15 23:12:22.0,共阅读12379次,回复1次 |
|
|
 |
学习C/C++的经验谈
|
|
| |
| 工作已经有三年半,算上学校里的时间,大约已有7年的C语言和5年的C++使用经验;熟练使用C/C++也有3年以上;现在的我自认为是可以称得上精通C/C++,基本现在市面上广泛被推崇的经典书籍,如:《C++ Primer》、《高级C++编程技术》、《STL原码剖析》、《Effective C++》、《C编程陷阱》、《Thinking in C++》等等,这些书只有《高级C++编程技术》和《C编程陷阱》在早些时候是通篇看完的(也是因为它们都比较薄),其它的现在基本上都已经不能启发我了,这些书虽然内容各不相同,但针对的读者水平是一样的,应该是已经学会编程语言,能够独立编程但尚未精通,在某些方面存在一定问题或欠缺的人; 对于书籍,我现在的追求又回到了纯理论,基本上是远离编程语言和计算机,比如,小波变换和《Algorithm I-IV》; 言归正传,关于很多人疑问的先学什么后学什么的问题,我认为:如果你选择C++作为最终的工具,或者是以C++为主的,那么我强烈建议你先学习C语言; 首先要说明的是,C和C++是两件截然不同的东西,学习C++可以完全没有C的基础,或者说可以完全不用先学C;但是,这样你是永远也不可能成为真正的C++大师的;你最多只能成为一个C++的熟练工人;C和C++有一个共同的奥义:内存管理,而你不学习C,单从对C++的理解 ...
|
|
| 作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读3793次,回复5次 |
|
|
 |
指针和引用的区别
|
|
| |
| 指针和引用的区别可以这样理解: 指针是内存中实实在在存在的空间地址,而引用则是编译器成次的东西,和数值是一个东西,编译时引用直接被实际的数值替换掉. 举些例子: 1.char *ch = NULL;//没问题 char &ch1 = NULL;//编译器不会答应 2.char ch2[] = "123"; char ch3[] = "456"; char *ch5 = ch2; char *ch6 = ch3; char ch7[] = "789"; char ch8[] = "123"; char &ch9 = ch7; char &ch0 = ch8; 看下面的区别: ch5 = ch6;//ch3[]没有变化 ch9 = ch0;//ch7的内存泄露了 3.指针引用: 指针引用是什么?就是给某个地址空间起个别名,编译后就是那个指针的内存空间; 4.引用做为形参时 大家知道,某个进程再调用一个函数时会创建一个特殊的线程,也就是把硬盘的某块信息复制到内存的进程空间,然后按照二进制代码执行.但是这块二进制代码已经被电脑写好了,内存已经分配好了呀,所以我们只能改变形参的值了,这就是c++的复制原理,只是复制,只能用,不能被传出,这就是为什么数值传递和指针传递不能被改变的原因.但是引用就不一样了,引用只有在使用时才去找它的"真身",所以就 ...
|
|
| 作者:流水 liushuiwu张贴于2009-09-13 15:34:48.0,共阅读607次,回复1次 |
|
|
 |
使得子控件大小随主窗口大小变化的宏
|
|
| |
|
|
 |
VC++的链接错误LNK2001
|
|
| |
| 学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。如果不深入地学习和理解VC++,要想改正连接错误LNK2001非常困难。
初学者在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为:
unresolved external symbol “symbol”(不确定的外部“符号”)。
如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。
以下是可能产生LNK2001错误的原因:
一.由于编码错误导致的LNK2001。
1.不相匹配的程序代码或模块定义(.DEF)文件能导致LNK2001。例如, 如果在C++源文件内声明了一变量“var1”,却试图在另一文件内以变量“VAR1”访问该变量,将发生该错误。
2.如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定义将导致LNK2001错误。
3.调用函数时如果所用的参数类型同函数声明时的类型不符将会产生LNK2001。
4.试图从基类的构造函数或析构函数中调用 ...
|
|
| 作者:不祥 Boyben张贴于2004-05-13 14:00:04.0,共阅读11182次,回复2次 |
|
|
 |
MFC 控件随窗体大小而变化
|
|
| |
| 1.添加OnInitialUpdate()
2.添加控件成员变量
void CFS_DataView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
CRect rect;
GetWindowRect( &rect );
if (m_wndlist.GetSafeHwnd())
{
m_wndlist.MoveWindow(CRect(0,22,rect.Width(),rect.Height()-20),TRUE);
}
}
|
|
| 作者:折翼天使 changhai203张贴于2009-07-03 10:14:03.0,共阅读1444次,回复1次 |
|
|
 |
SADSA
|
|
| |
| ...ADASDASD
|
|
| 作者:艾弗森 r11222张贴于2009-02-23 14:04:22.0,共阅读696次,回复1次 |
|
|