C++Builder 程序员博客
22 Aug
如何获取Form窗口的显存地址或者图形内存地址?我需要快速更改Form的一块区域,用Draw速度太慢,我想得到它的显存地址或者图形内存地址,直接用汇编写的memcpy操作,是否可行?谢谢高手们指点!
又不是实模式,没有固定显存地址的。
那Form有内存地址吗?就象TBitmap的内存地址一样
首先,“你直接用汇编写的memcpy操作”,还真不一定有memcpy快。
1cctv(走天涯)兄,真强大,我是做游戏的,现在要搞休闲小游戏,DX用过的人都知道很讨厌,主要是微软以后的操作系统会逐渐禁止运行以前DX写的程序,方便他推DX10、DX11吧,再说DX我用了7年多了,觉得非常好,一直很舍不得,后来微软推Win7操作系统突然一下把我打醒了,所以我是不想再用DX了,而且小游戏只要把GDI部分处理好了,速度还是可以的,我就想接管GDI的显存区,或者GDI的内存区。
2 Jul
#include <windows.h>
#include <windowsx.h>
#include <ddraw.h>
#define INITGUID
BOOL InitWindow( HINSTANCE hInstance, int nCmdShow );
LRESULT CALLBACK q( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) ;
HWND hwnd ;
int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg; //消息结构
if (!InitWindow(hInstance,nCmdShow))
{
MessageBox ( GetActiveWindow(), "初始化DirectDraw过程中出错!", "Error", MB_OK ) ;
return false;
}//初始化窗体
while(1) //消息循环
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message==WM_QUIT) //退出消息循环
break;
TranslateMessage(&msg); //得到消息,处理回调函数
DispatchMessage(&msg);
}
}
return msg.wParam;
}
//*********************************************************
//函数:InitWindow( )
//功能:创建窗口
//*********************************************************
static BOOL InitWindow( HINSTANCE hInstance, int nCmdShow )
{
WNDCLASS wc;
wc.style = NULL; //窗口类风格
wc.lpfnWndProc = q; //指向窗口过程函数的指针
wc.cbClsExtra = 0; //窗口类附加数据
wc.cbWndExtra = 0; //窗口类附加数据
wc.hInstance = hInstance; //拥有窗口类的实例句柄
wc.hIcon = NULL; //最小窗口图标
wc.hCursor = NULL; //窗口内使用的光标
wc.hbrBackground = NULL; //用来着色窗口背景的刷子
wc.lpszMenuName = NULL; //指向菜单资源名的指针
wc.lpszClassName = NULL;// 指向窗口类名的指针
RegisterClass(&wc); //注册窗口
hwnd=CreateWindow("menpao_RPG_DEMO","menpao_RPG_DEMO",WS_POPUP|WS_MAXIMIZE,0,0,GetSystemMetrics( SM_CXSCREEN ),GetSystemMetrics( SM_CYSCREEN ), NULL,NULL,hInstance,NULL);
if( !hwnd )
{
MessageBox ( GetActiveWindow(), "初始化DirectDraw过程中出错!", "Error", MB_OK ) ;
return FALSE;
}
ShowWindow(hwnd,nCmdShow); //显示窗口
UpdateWindow(hwnd); //刷新窗口
return TRUE;
}
//************************************************************
//函数:WinProc( )
//功能:处理主窗口消息
//************************************************************
LRESULT CALLBACK q( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
switch( message )
{
case WM_KEYDOWN://击键消息
switch( wParam )
{
case VK_ESCAPE:
MessageBox ( GetActiveWindow(), "初始化DirectDraw过程中出错!", "Error", MB_OK ) ;
PostQuitMessage( 0 );//退出
break;
}
return 0;
case WM_LBUTTONDOWN:
MessageBox ( GetActiveWindow(), "初始化DirectDraw过程中出错!", "Error", MB_OK ) ;
return 0;
case WM_RBUTTONDOWN:
MessageBox(hwnd,NULL,"mouse",MB_OK);
return 0;
case WM_MBUTTONDBLCLK:
MessageBox(hwnd,NULL,"mouse",MB_OK);
return 0;
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam); //调用缺省消息处理过程
}
程序执行到
if( !hwnd )
{
MessageBox ( GetActiveWindow(), "初始化DirectDraw过程中出错!", "Error", MB_OK ) ;
return FALSE;
}
这里就会报错 也就是说无法产生hwnd 为什么啊???
你还没向系统注册窗口吧
@.@没看到,你注册了,不好意思,怎么会没获得窗口句柄呢。。。。应该没问题啊。
wc.lpszClassName = NULL;// 指向窗口类名的指针
必须给出窗口类名
窗口类名与CreateWindow第一个参数相同
为什么还是用不成?改过了 还是无法创建
把报错贴上来看看
把报错贴上来看看
wc.lpszClassName 为类名,必须要有,它的值要与CreateWindow 第一个参数相同(也是类名)
clean 试试,vc++有时候就有这个毛病!
你创建一个win32默认的工程,看看人家是怎么创建的。还有就是你可以调试,用getlasterror来获取错误的值,在c++错误查看工具中看是什么原因。自己用调试啊!
30 Apr
有两个窗体:主窗体form1和form2
form2覆盖整个桌面,form1较小且在form2上面。如何实现:form1最小化时,form2仍然覆盖整个桌面。
你反过来创建不行吗?
不行,form1同时是MDIForm
<
有什么事件可以判断windowsstate改变没?如果可以的话我可以先把form1minimize然后show form2
基本上创建两个窗口,一个为主一个为子,不用处理就可以实现了的啊??
关键是另一个不是子窗口
主窗体都最小话了,子窗体不可能不最小化
另外,为什么一定要是mdi窗体呢?
肯定有别的解决方法的
学习学习
<
可以修改。子窗体先show,然后再出现主窗口总可以吧?但我的程序怎么实现不了,不知道是什么原因,请指教
知道了,在主窗体form2的onshow时间中加入 Form1->ShowModal();
等form1关闭时才继续显示form2,呵呵 自己解决了
30 Mar
如题..完全在父窗口内
难道现在你的MDI子窗口可以移出父窗口??
能移出一部分
用代码控制比较方便!
自己顶一下
如果真的是MDI子窗口的话,应该不可能移出其父窗口的。。。
MDI子窗体移不出父窗体的
回帖不看帖啊…指的是完全在父窗口内,移动时窗口其中一边遇到父窗口边上时不能再往外移动.
现在只是鼠标没办法移出,但鼠标在边上时窗口已经移出一部分了.
加分,继续顶一下
据说可以拦截子窗体的OnMove事件,你再搜一下相关的内容。
<
<
大小没有失控。因为只响应WM_MOVING消息。试过你就知道了。
移到左边,如果再往左移的话,窗口会变小(从右边缩回来),移到右边,窗口会变大(从左边拉伸出去)
会有点抖,不过也可以了,谢谢CCRUN
哈哈,自从遇上妖哥,这BCB就变得简单多了!
19 Feb
比方说:我想得到所有含有“魔兽世界”字符的窗口的句柄“
有什么API函数可以实现吗?“
还有用c++
写出的控制台程序能在后台实现吗?“因为我想写个游戏自动挖矿的工具“`让程序进入死循环“““`
(以前是用按键精灵写的“`现在按键精灵被游戏屏遮了“所以到这里来找出路:呵呵)““`
楼上的“你这个函数好象是查找一个的
我要的是遍历所以带有"魔兽世界“的窗口“我查了一下API函数集“找不到
下面是我用按键精灵写的遍历窗口函数
Plugin Window.Search(("魔兽世界")
下面的的是按键精灵查找窗口的函数
Plugin Window.Find()
感觉和你哪个有点相似“呵呵“
23 Dec
是这样的,比如我把form2设为available了,然后在form1上按button1的时候动态创建了form2了,再按一下又动态创建了form2,这个时候我把第一个动态创建的form2关掉了,但是不释放内存,我现在要再调用那个form应该怎么办啊,如果Form->show()的话出现的应该是第二个创建的form啊
你new出两个窗口出来,要保存它们的指针,通过指针就可以访问了。也是通过这个指针来释放。
如果你自己不保存动态创建对象的指针,我也想不出来有什么办法可以访问对象
用数组吧
form2设为available了,你把form2想象成一个资源,你new了一个form2出来,当你继续点击button时,先做个判断,如果form2已经new给一个指针了,就不要new新的了。
20 Dec
问题描述:
写一个程序,主界面一个按钮show一个子窗口,子窗口的cancel按钮在close自己前调用application的最小化,在网上说,有的人提出采用 Application->Minimize() 最小化这样的方法,不知道哪位大侠能否给我点代码,谢谢!
调用application的最小化谁要最小化?
你的问题描述的不是很清楚!
不好意思,下午一直没有关注帖子,我的意思,自己程序去调用Minimize()把自己最小化
你是想隐藏那个子窗体吗?还是要最小化主窗体?
还是不太明白需求。到底是要最小化子窗体还是最小化应用程序?
是啊,太奇怪了,呵呵呵呵
27 Nov
我现在有3个窗口:form1、form2、form3,在form1中使用Show()的方式调用form2(form.Show()),然后在form2中使用ShowModal的方式调用form3(form3.ShowModal()),这个时候在form3不关闭的情况下窗口form1和form2都是无法操作的,有没有什么方法使form1能操作,而form2不能操作?
刚找了一种方法:
就是在form2调用form3的时候还是使用Show()方法,再加上一句代码:form2->Enabled=false;然后在form3的FormClose中再把form2的Enabled属性设为true即可。
大家还有其他的方法没,拿出来分享一下。
这种方法有个缺点就是ShowModal那种堵塞式的调用方式没有了,有点郁闷。。。
使用多文档
你是想用from1弹出from2,再用from2弹出from3,
在操作from3的时候,还可以操作from1,但from2不能操作?
试试用线程控制from窗口的创建。
是不是可以在form1中发消息给form2,让form2 show。之后form2的现实和form1的没关系。
<
<
顶一下
牛人都到哪儿去了?看来关注BCB的人真的是原来越少了。
不是很清楚楼主的意思,想达到什么目的
试试看用MDI Application
楼上的方法暂时不考虑,因为改动太大。
问题我再描述一下:我的应用程序有个主界面,通过主界面可以打开多个子窗口,同样子窗口上也可以打开多个子窗口,使用Form的Show方法是没什么问题的,一旦这些子窗口中有一个是用ShowModal方法打开的,其他的窗口都不能动了,有没有什么方法可以避免这种情况出现,仅仅使父窗口不能动?
举个例子:现在有form1,form2,form3,form4共四个窗口,现在这四个窗口都是可操作的,然后在form4中使用ShowModal方法打开一个form5(就是在form4中调用form5.ShowModal()),这个时候除了form5可以操作以外,其他四个都动不了了,而我想要的结果是只让form4不能动,而其他3个不受影响。
我上面已经找到一种方法了,只是有一点缺陷,见1楼。
我能想到的也是类似1楼的方法,是改变visible属性的值,隐藏掉
现在我们也遇到这样的问题,不过影响不大,所以没有花太多时间在这上面
没弄明白,既然你想ShowModal,为什么还要去操作后面的窗体呢,你想操作后面的窗体,直接Show不就好了!
用多线程做,可以达到非阻塞效果!
楼主,你自己1楼的方法就可以啦。。。
就直接使用 Form->Enabled 来控制所有窗体。。
不过,你要达到阻塞效果的话,就要根据你程序的具体任务来想办法了
vincentgemini还是没看懂我的问题哦。
我已经用设置Enabled属性的方法实现了,现在只是想看看有没有其他更好的办法。
再等一天结贴。
27 Nov
我现在有3个窗口:form1、form2、form3,在form1中使用Show()的方式调用form2(form.Show()),然后在form2中使用ShowModal的方式调用form3(form3.ShowModal()),这个时候在form3不关闭的情况下窗口form1和form2都是无法操作的,有没有什么方法使form1能操作,而form2不能操作?
刚找了一种方法:
就是在form2调用form3的时候还是使用Show()方法,再加上一句代码:form2->Enabled=false;然后在form3的FormClose中再把form2的Enabled属性设为true即可。
大家还有其他的方法没,拿出来分享一下。
这种方法有个缺点就是ShowModal那种堵塞式的调用方式没有了,有点郁闷。。。
使用多文档
你是想用from1弹出from2,再用from2弹出from3,
在操作from3的时候,还可以操作from1,但from2不能操作?
试试用线程控制from窗口的创建。
是不是可以在form1中发消息给form2,让form2 show。之后form2的现实和form1的没关系。
<
<
顶一下
牛人都到哪儿去了?看来关注BCB的人真的是原来越少了。
不是很清楚楼主的意思,想达到什么目的
试试看用MDI Application
楼上的方法暂时不考虑,因为改动太大。
问题我再描述一下:我的应用程序有个主界面,通过主界面可以打开多个子窗口,同样子窗口上也可以打开多个子窗口,使用Form的Show方法是没什么问题的,一旦这些子窗口中有一个是用ShowModal方法打开的,其他的窗口都不能动了,有没有什么方法可以避免这种情况出现,仅仅使父窗口不能动?
举个例子:现在有form1,form2,form3,form4共四个窗口,现在这四个窗口都是可操作的,然后在form4中使用ShowModal方法打开一个form5(就是在form4中调用form5.ShowModal()),这个时候除了form5可以操作以外,其他四个都动不了了,而我想要的结果是只让form4不能动,而其他3个不受影响。
我上面已经找到一种方法了,只是有一点缺陷,见1楼。
我能想到的也是类似1楼的方法,是改变visible属性的值,隐藏掉
现在我们也遇到这样的问题,不过影响不大,所以没有花太多时间在这上面
没弄明白,既然你想ShowModal,为什么还要去操作后面的窗体呢,你想操作后面的窗体,直接Show不就好了!
用多线程做,可以达到非阻塞效果!
楼主,你自己1楼的方法就可以啦。。。
就直接使用 Form->Enabled 来控制所有窗体。。
不过,你要达到阻塞效果的话,就要根据你程序的具体任务来想办法了
vincentgemini还是没看懂我的问题哦。
我已经用设置Enabled属性的方法实现了,现在只是想看看有没有其他更好的办法。
再等一天结贴。
14 Jun
我在主窗口中放置了一个Panel,再在工程中添加了一个form,form在Show时,把它的parent设置为主窗口的Panel,但是之后,form中的文本控件如Edit、Memo等就不能用鼠标点击了,但是可以用tab键使它们进入编辑状态
环境是:bcb2009
哪位知道怎么处理吗?
根据你的要求把子窗口用frame实现比较好.
用form就一定会出现这个问题吗?确实不想用frame
再设一下form上edit,memo等的parent为form
用API:SetParent就可以了,非常不建议将Form的Parent改为Panel->Handle这种方式。
SetParent和重新设置Edit、Memo的Parent都不能解决这个问题哦!!!!!!!!!!!!
怎么办呢?哪位有什么好招术???