我爱builder

C++Builder 程序员博客

如何获取Form窗口的显存地址或者图形内存地址?我需要快速更改Form的一块区域,用Draw速度太慢,我想得到它的显存地址或者图形内存地址,直接用汇编写的memcpy操作,是否可行?谢谢高手们指点!又不是实模式,没有固定显存地址的。那Form有内存地址吗?就象TBitmap的内存地址一样首先,“你直接用汇编写的memcpy操作”,还真不一定有memcpy快。

1cctv(走天涯)兄,真强大,我是做游戏的,现在要搞休闲小游戏,DX用过的人都知道很讨厌,主要是微软以后的操作系统会逐渐禁止运行以前DX写的程序,方便他推DX10、DX11吧,再说DX我用了7年多了,觉得非常好,一直很舍不得,后来微软推Win7操作系统突然一下把我打醒了,所以我是不想再用DX了,而且小游戏只要把GDI部分处理好了,速度还是可以的,我就想接管GDI的显存区,或者GDI的内存区。

  • Filed under: C++ Builder
  • #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++错误查看工具中看是什么原因。自己用调试啊!

  • Filed under: C++ Builder
  • 有两个窗体:主窗体form1和form2
    form2覆盖整个桌面,form1较小且在form2上面。如何实现:form1最小化时,form2仍然覆盖整个桌面。你反过来创建不行吗?不行,form1同时是MDIForm<
    有什么事件可以判断windowsstate改变没?如果可以的话我可以先把form1minimize然后show form2基本上创建两个窗口,一个为主一个为子,不用处理就可以实现了的啊??关键是另一个不是子窗口主窗体都最小话了,子窗体不可能不最小化

    另外,为什么一定要是mdi窗体呢?

    肯定有别的解决方法的学习学习<
    可以修改。子窗体先show,然后再出现主窗口总可以吧?但我的程序怎么实现不了,不知道是什么原因,请指教知道了,在主窗体form2的onshow时间中加入 Form1->ShowModal();
    等form1关闭时才继续显示form2,呵呵 自己解决了

  • Filed under: C++ Builder
  • 如题..完全在父窗口内难道现在你的MDI子窗口可以移出父窗口??能移出一部分用代码控制比较方便!自己顶一下如果真的是MDI子窗口的话,应该不可能移出其父窗口的。。。MDI子窗体移不出父窗体的回帖不看帖啊…指的是完全在父窗口内,移动时窗口其中一边遇到父窗口边上时不能再往外移动.

    现在只是鼠标没办法移出,但鼠标在边上时窗口已经移出一部分了.加分,继续顶一下据说可以拦截子窗体的OnMove事件,你再搜一下相关的内容。<

    <
    大小没有失控。因为只响应WM_MOVING消息。试过你就知道了。移到左边,如果再往左移的话,窗口会变小(从右边缩回来),移到右边,窗口会变大(从左边拉伸出去)

    会有点抖,不过也可以了,谢谢CCRUN 哈哈,自从遇上妖哥,这BCB就变得简单多了!

  • Filed under: C++ Builder
  • 比方说:我想得到所有含有“魔兽世界”字符的窗口的句柄“
    有什么API函数可以实现吗?“
    还有用c++
    写出的控制台程序能在后台实现吗?“因为我想写个游戏自动挖矿的工具“`让程序进入死循环“““`
    (以前是用按键精灵写的“`现在按键精灵被游戏屏遮了“所以到这里来找出路:呵呵)““`

    楼上的“你这个函数好象是查找一个的
    我要的是遍历所以带有"魔兽世界“的窗口“我查了一下API函数集“找不到
    下面是我用按键精灵写的遍历窗口函数
    Plugin Window.Search(("魔兽世界")
    下面的的是按键精灵查找窗口的函数
    Plugin Window.Find()
    感觉和你哪个有点相似“呵呵“

  • Filed under: C++ Builder
  • 是这样的,比如我把form2设为available了,然后在form1上按button1的时候动态创建了form2了,再按一下又动态创建了form2,这个时候我把第一个动态创建的form2关掉了,但是不释放内存,我现在要再调用那个form应该怎么办啊,如果Form->show()的话出现的应该是第二个创建的form啊你new出两个窗口出来,要保存它们的指针,通过指针就可以访问了。也是通过这个指针来释放。
    如果你自己不保存动态创建对象的指针,我也想不出来有什么办法可以访问对象用数组吧form2设为available了,你把form2想象成一个资源,你new了一个form2出来,当你继续点击button时,先做个判断,如果form2已经new给一个指针了,就不要new新的了。

  • Filed under: C++ Builder
  • 问题描述:
    写一个程序,主界面一个按钮show一个子窗口,子窗口的cancel按钮在close自己前调用application的最小化,在网上说,有的人提出采用 Application->Minimize() 最小化这样的方法,不知道哪位大侠能否给我点代码,谢谢!调用application的最小化谁要最小化?你的问题描述的不是很清楚!不好意思,下午一直没有关注帖子,我的意思,自己程序去调用Minimize()把自己最小化 你是想隐藏那个子窗体吗?还是要最小化主窗体?还是不太明白需求。到底是要最小化子窗体还是最小化应用程序?是啊,太奇怪了,呵呵呵呵

  • Filed under: C++ Builder
  • 我现在有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属性的方法实现了,现在只是想看看有没有其他更好的办法。

    再等一天结贴。

  • Filed under: C++ Builder
  • 我现在有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属性的方法实现了,现在只是想看看有没有其他更好的办法。

    再等一天结贴。

  • Filed under: C++ Builder
  • 我在主窗口中放置了一个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都不能解决这个问题哦!!!!!!!!!!!!
    怎么办呢?哪位有什么好招术???

  • Filed under: C++ Builder
  • 类别

    最新

    标签

    链接


    存档