关于自己封装Window类的问题

APIer 2001-03-10 11:59:00
最近在家里休息,没事自己写了一个对API的封装,主要的类有2个,一个是应用程序类JApplication,一个是窗口类,JWindow,还有消息映射等。但是我发现在bcb中,TForm有一个Width等的属性,修改后可以直接让窗口大小改变,请问他们是怎么做的?我心在采用了一种很愚蠢的办法,就是重载了一个JINT结构,重载他的=操作符,int的强制类型转换等,我想应该有更好的解决方案吧?
还有sdk中有什么函数直接修改窗体的大小位置么?
谢谢了:)
...全文
597 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
APIer 2001-03-20
  • 打赏
  • 举报
回复
In355Hz(好象一条狗) 
着几天csdn速度慢的出奇,想上来谢谢你都不行:)
你说的proerty我试了,效果不错,我回家休息,没有带盘,没有msdn,只能依靠vc的自动弹出来写东西,好痛苦
In355Hz 2001-03-18
  • 打赏
  • 举报
回复
MSDN上有:

__declspec(property(get=GetX, put=PutX)) int x[];

The above statement indicates that x[] can be used with one or more array indices. In this case, i=p->x[a][b] will be turned into i=p->GetX(a, b), and p->x[a][b] = i will be turned into p->PutX(a, b, i);

APIer 2001-03-17
  • 打赏
  • 举报
回复
顶一下,请教__declspec(property)的用法,麻烦给个简单的例子:)
APIer 2001-03-16
  • 打赏
  • 举报
回复
In355Hz(好象一条狗) onidle我自己想要在座游戏的时候放住循环,用来改变窗口大小,性能有问题
APIer 2001-03-13
  • 打赏
  • 举报
回复
我的email受到了么?
classfactory 2001-03-12
  • 打赏
  • 举报
回复

classfactory@263.net。有空就给我写信吧。你的mail好像怪怪的!笔误 ? china :chian ?

APIer 2001-03-12
  • 打赏
  • 举报
回复
classfactory(void) 大哥:
我不知道你是否比我大,但是既然你都叫我小弟,我就只有叫你一声大哥哥:),我78年的。
其实,我还是很谢谢你的帮助的,我们交个朋友怎么样?给我email 吧,APIer@chian.com,不过我还是要说:1,bcb其实也不错了:) 1,我写的封装纯粹为了玩一玩:)
APIer 2001-03-11
  • 打赏
  • 举报
回复
谢谢 babysloth(小懒虫虫) 
我以前不知道__declspec(property)的用法,没有用过,我做这个不过是做个实验,不可能拿出来用的:)
classfactory 2001-03-11
  • 打赏
  • 举报
回复

老弟,没什么,忠言总是逆耳的。说出来你也许不信,我从tc2.0到tc++,到bc5.0,到bcb,再到delphi、vb,现在在用vc开发项目(说我是“vc的”好像不太贴切)。从个人感情角度讲,我对Borland一直是很欣赏的,但是这个社会个人感情能当饭吃?kao,是不是又有人要丢砖头了?我闪!呵呵。

APIer 2001-03-11
  • 打赏
  • 举报
回复
classfactory(void) :
我的Width等属性不是protected的,而是public的,还有我从来都没有说别人不能做出来封装,还有,我封装Window类不是看过MFC,我是模仿的VCL,我也觉得我的并不是有什么技巧,我只是探讨一下,向各位高手学习
babysloth 2001-03-11
  • 打赏
  • 举报
回复
“也许是有一些vb或delphi、bcb程序员感兴趣”,老哥,别这样,VC的也不用这么说别人吧。
classfactory 2001-03-11
  • 打赏
  • 举报
回复

To APIer(APIer):
这不是能不能解决的问题,这是个原则问题(就像一个对象的protected成员不允许其他对象随便访问一样)。我对你并没有什么意思,只是想让你想问题时多从“思想”的角度出发,而不是这种没什么大意义的“技巧”(也许是有一些vb或delphi、bcb程序员感兴趣)。至于封装窗口的类,随便找个人都能在10分钟内搞定。不相信?打开atlwin.h看一看CWindow。

babysloth 2001-03-11
  • 打赏
  • 举报
回复
我想我大概知道您的意思了,随便说两句,看看忘了就是了。
BCB/DELPHI里的属性是来自Borland对Object Pascal的扩充,当然C++也拣了个便宜。
其实这个属性没意思,COM/ATL有相应的东西。
真正的就是getWidth,setWidth之类的函数,写得好看点就是Width = ... 象属性的样子。
在WINDOWS里有__declspec(property)也可以实现差不多的东西,写起来也蛮简单的。

不过您自己封装似乎意义不大,MFC和VCL应该足够了吧。
您把Width作为了成员变量吧,如果以后添加或删除一两个属性,您的这个类
和所有继承至这个类的子类可都要全部重新编译,要不就跟MFC一样,背一堆MFCxx.DLL。

至于In355Hz(好象一条狗)的方法不知道是不是您所想要的。他的方法是通过消息来的,
不过这种属性似乎并不用这么麻烦。象MFC干脆就全用函数解决算了。全部重载看起来
似乎有点难看,您不觉得吗?用个smart pointer也许可以简洁一点。
In355Hz 2001-03-11
  • 打赏
  • 举报
回复
你可以试试我的方法,是在VC上编译通过,测试过的,只要由于任何原因修改了Width,Height参数,可以马上响应并修改窗体大小。
In355Hz 2001-03-11
  • 打赏
  • 举报
回复
补充一下,我看了很久才明白APIer的意思,BCB和TForm我都没用过。
In355Hz 2001-03-11
  • 打赏
  • 举报
回复
我想是不是在线程Idle时监视Height/Width,并动态改变的?
试在JApplication/JUIThread的消息循环这样写,以监视线程是否Idle:
#define WM_APPIDLE WM_USER+1000

MSG msg;
BOOL bProcMsg = TRUE;

while(bProcMsg) //如果没有WM_QUIT消息,线程一直处于Idle
{
while(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) //察看队列中是否有消息
{
if(!GetMessage(&msg, NULL, 0, 0)) //如果有消息,取得此消息
{
bProcMsg = FALSE; //如果取得WM_QUIT消息,则退出全部循环
PostQuitMessage(0);
break;
}
if(msg.message != WM_APPIDLE) //屏蔽外部向线程窗口发送的Idle消息
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
OnIdle(); //执行线程Idle时的处理
}
线程的OnIdle函数,可以是虚函数以便重载:
void JApplication::OnIdle()
{
SendMessage(m_hMainWnd, WM_APPIDLE, 0, 0); //直接调用线程主窗口处理WM_APPIDLE消息,如果你的线程主窗口不是以m_hMainWnd(MFC)方式存放于成员变量,方法类似。
//其它Idle处理。
}
然后在你的窗口类的默认消息处理中处理此消息,检查窗口大小:
switch(uMsg)
{
case WM_APPIDLE: //自定义的Idle消息
{
RECT rect;
GetWindowRect(hwnd,&rect);
if(Width != (rect.right-rect.left) || Height != (rect.bottom=rect.top))
MoveWindow(hwnd,rect.left,rect.top,Width,Height,TRUE); //改变窗口大小
return TRUE; //当然,这里可以加入你的消息映射机制以便使用者可以重载WM_APPIDLE消息。
}
break;
....
}
要在一个变量被改变时立即得到信息,必须监视这个变量,我想TForm也不至于用一个线程监视这些变量吧,机理应该和这是类似的。MFC要达到这个能力也不困难,重载窗口的WM_KICKIDLE消息就是了,和上面的WM_APPIDLE消息相同的(说实话,我上面的代码仿造了MFC的类似代码)。
softarts 2001-03-11
  • 打赏
  • 举报
回复
1.如果不用windows的api封装的话(就是象mfc那样的),那可以怎样封装?还有别的
api吗?
2.borland的东西是怎样封装的,谁能介绍一下?是在pascal编译器上面实现的?
3.有个人主页吗?把代码放上来看看.
4.更改尺寸很容易,就是setwindowpos
APIer 2001-03-11
  • 打赏
  • 举报
回复
我现在还是通过重载了JINT的=等操作符,然后将所有的width等属性申明成了JINT类的,这样修改他们就将重新画窗口了,我这样不过是研究一下了。
还有类工厂同志,我想说,希望你不要随便说我头脑不正常,你觉得不能解决,也许还有人能够解决呢?就算不能解决,我的头脑也没有问题,不错,我的编程水平很低,也没有系统的的学习计算机课程,但是请对我这个菜鸟多一些鼓励:)如果不介意,能做个朋友么?我的email APIer@china.com
对了 softarts(飞扬) 我的竹叶 http://calfsoft.51.net,很久没有更新了,今天晚上我把我的封装传上去,请大家多多指点,不过最好不要骂我:)
classfactory 2001-03-10
  • 打赏
  • 举报
回复

你是在用C++吗?你懂不懂的封装?属性是随便就允许直接修改的嘛?另外,象这种东西不是在语言级别实现的。你的思路有问题。

vcbear 2001-03-10
  • 打赏
  • 举报
回复
不是吧,会封装windows消息不知道怎么改变window大小?
大哥您是如何学习的,不是调侃,真的想知道,您是C++高手吧,能不能把你的封装类公开
让大家参考一下。
改变窗体大小的函数位置是 SetWindowPos,很简单的。
加载更多回复(6)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧