win32sdk的父窗口,delphi dll里的子窗口 上面的按钮,一点就卡死

qq731840256 2011-02-11 11:47:35
如题, win32 sdk编译的EXE,载入delphi写的dll,dll创建子窗口,子窗口上的按钮,一点击,整个程序就卡死,但是在子窗口上怎么点都不会. 其他控件也试过,都一样,还没有执行事件代码,就卡死了.
...全文
187 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq731840256 2011-02-12
  • 打赏
  • 举报
回复
晕啊,我刚刚又试了一下,在子窗口上增加OnClick消息,在窗口上点击,事件的代码可以正常执行,没有什么问题.
qq731840256 2011-02-12
  • 打赏
  • 举报
回复
DELPHI创建的子窗口上,鼠标移动,点击左右键都没问题,在按钮上单击双击右键都可以,就是一点左键就卡死.并没有映射任何的事件.
qq544464298 2011-02-12
  • 打赏
  • 举报
回复
试试将子窗口风格设置为ToolWindow
qq731840256 2011-02-11
  • 打赏
  • 举报
回复
我又试了下,我把CreateParented 换成 Create创建窗口,就没事了,为什么会这样呢.
qq731840256 2011-02-11
  • 打赏
  • 举报
回复
我用spy++看了,是没有WS_OVERLAPPEDWINDOW风格的,如果加上这个风格,就会出现边框和标题栏.
金卯刀 2011-02-11
  • 打赏
  • 举报
回复
try:在创建dll中的form时,去除WS_OVERLAPPEDWINDOW风格,同时设置WS_ChildWindow风格
qq731840256 2011-02-11
  • 打赏
  • 举报
回复
但是不管用CreateParented还是Create,只要设置成WS_ChildWindow的风格就出现这个问题.
qq731840256 2011-02-11
  • 打赏
  • 举报
回复
我想要ChildWindow的效果
金卯刀 2011-02-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qq731840256 的回复:]
不好意思各位,我弄错了,没有用CreateParented的时候,根本没有ChildWindow属性,使用SetWindowLong来设置style增加ChildWindow属性后,还是一样的情况,卡死.
[/Quote]
createParented会依据传进来的参数,设置窗口类的wndParent。与childwindow不是一回事。
childwindow类似button这种效果。
不知道你要的是MDI效果还是ChildWindow的效果?
qq731840256 2011-02-11
  • 打赏
  • 举报
回复
function CC_Plugininit(CCVersion:PAnsiChar;CChWnd:HWND;hInst:Cardinal;var CplhWnd:HWND;var CplhIcon:HICON;shortname:PAnsiChar):UINT;stdcall;
begin
hWndMain := CChWnd;
Form1 := TForm1.CreateParented(CChWnd);
//Form1 := TForm1.Create(nil);
CplhWnd := Form1.Handle;
CplhIcon := LoadIcon(HInstance,'MYICON');
lstrcpy(shortname,'我是Delphi');
CC_InitFunction(hInst);
CC_Addtolist('我是Delphi',RGB(255,0,0));
Result := 1;
end;


这个函数被导出,提供给SDK编译的EXE调用.

HWND CplhWnd = NULL;
HICON CplhIcon = NULL;
char szTabCaption[32] = {0};
pPluginInfo.CC_Plugininit("2.6",hWndMain,hInst,CplhWnd,CplhIcon,szTabCaption);
if (CplhWnd != NULL && IsWindow(CplhWnd))
{
pPluginInfo.hPluginWnd = CplhWnd;
TCITEM tie;
int nIcon = -1;
if (CplhIcon != NULL)
{
nIcon = ImageList_AddIcon(hImageList,CplhIcon);
}
tie.mask = TCIF_TEXT|TCIF_IMAGE|TCIF_PARAM;
tie.iImage = nIcon;
tie.pszText = (LPSTR)szTabCaption;
tie.lParam = nPos;
TabCtrl_InsertItem(hWndTabCtrl,nPos,&tie);
//SetWindowLong(CplhWnd,GWL_STYLE,WS_CHILDWINDOW|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN);
SetParent(CplhWnd,hWndTabCtrl);
RECT rc;
GetClientRect(hWndTabCtrl,&rc);
rc.right -= 4;
rc.left += 1;
rc.top += 22;
rc.bottom -= 24;
MoveWindow(CplhWnd,rc.left,rc.top,rc.right,rc.bottom,TRUE);
//SetWindowPos(CplhWnd,HWND_TOP,rc.left,rc.top,0,0,SWP_NOSIZE);
ShowWindow(CplhWnd,SW_SHOW);
}


这个是在EXE里LoadLibrary dll后,GetProcAddress得到函数地址,然后调用,在参数中返回DLL创建的窗口句柄,执行SetWindowLong设置窗口风格,然后使用SetParent设置窗口的父级. 问题出在delphi创建的这个窗口,如果风格设置为ws_childwindow就出现无法响应事件并且程序假死的问题,如果是ws_popup就不会,但是这样的风格不是我希望的.dll里窗口的属性是默认的.除了将BorderStyle设置为bsNone外没有修改其他的
林石公 2011-02-11
  • 打赏
  • 举报
回复
无代码无真相
qq731840256 2011-02-11
  • 打赏
  • 举报
回复
不好意思各位,我弄错了,没有用CreateParented的时候,根本没有ChildWindow属性,使用SetWindowLong来设置style增加ChildWindow属性后,还是一样的情况,卡死.

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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