转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
Window SubClassing另类运用(之二)         ★★★★

Window SubClassing另类运用(之二)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:3061 更新时间:2009/4/23 18:39:46
  Found := False;


  while IsWindow(wnd) do begin


    GetClassName(wnd, ClassName, 80);


    if lstrcmpi(ClassName, ''''SysTreeView32'''')=0 then begin


       Found := True;


       Break;


    end;


    wnd := GetWindow(wnd, GW_HWNDNEXT);


  end;


  if not Found then Exit;


为了能够让插入的ComboBox和其他窗口控件的布局协调一致,首先需要找到用来显示文件夹的TreeView窗口。我的计划是:让ComboBox占据TreeView原来的位置(当然它的高度要比TreeView小得多),然后,包括TreeView在内的其他窗口依次下移。下面是实现代码:


  // Add combo Box and move other controls down


  GetWindowRect(wnd, rc);


  ScreenToClient(AWnd, rc.TopLeft);


  ScreenToClient(AWnd, rc.BottomRight);


  wndCombo := CreateWindow(''''COMBOBOX'''', '''''''',


                         WS_CHILD or WS_VISIBLE or CBS_DROPDOWNLIST or CBS_OWNERDRAWFIXED or CBS_HASSTRINGS,


                         rc.Left, rc.Top,


                         rc.Right-rc.Left, rc.Bottom-rc.Top,


                         AWnd, HMENU(IDC_COMBO),


                         HInstance, nil);


  SendMessage(wndCombo, WM_SETFONT,


              SendMessage(AWnd, WM_GETFONT, 0, 0),


              1);


  OldStyle := GetWindowLong(wnd, GWL_STYLE);


  SetWindowLong(wnd, GWL_STYLE, OldStyle or TVS_SHOWSELALWAYS);


 


  SaveRect := rc;


  wnd := GetWindow(AWnd, GW_CHILD);


  while IsWindow(wnd) do begin


    GetWindowRect(wnd, rc);


    ScreenToClient(AWnd, rc.TopLeft);


    ScreenToClient(AWnd, rc.BottomRight);


    if (wnd<>wndCombo) and (rc.Top>=SaveRect.Top) then


       SetWindowPos(wnd, HWND_NOTOPMOST, rc.Left, rc.Top+40, 0, 0, SWP_NOSIZE or SWP_NOZORDER);


    wnd := GetWindow(wnd, GW_HWNDNEXT);


  end;


  GetWindowRect(AWnd, rc);


  SetWindowPos(AWnd, HWND_NOTOPMOST, 0, 0, rc.Right-rc.Left, rc.Bottom-rc.Top+40, SWP_NOMOVE or SWP_NOZORDER);


 


如果你过去很少用API写程序,那么这些代码可能让你看得有点头晕。基本上上述程序完成如下的工作:


(1)计算TreeView在窗口中的位置;


(2)建立ComboBox窗口,并基于TreeView的位置将它放置到合理的地方;


(3)将ComboBox的字体设置为和整个窗体的字体相同(这一步是必要的,否则显示的效果会很难看);


(4)为TreeView的窗口风格添加TVS_SHOWSELALWAYS位,从而在焦点移动到ComboBox的时候,仍然可以明显的观察到TreeView中究竟选中了哪个项目;


(5)将窗口中的其他控件依次下移,从而为ComboBox腾出必要的空间;


(6)将窗口本身的高度也略微放大,从而适应添加ComboBox以后的大小。


 


下一步就是向ComboBox中增加一些表项,否则的话它就是一个鸡肋。我决定添加两种项目:(1)系统中的某些特殊路径,这些路径可以通过SHGetSpecialFolderLocation获得;(2)通常的文件路径。为了让代码简洁一些,我增加了一个辅助函数:


 


  procedure InsertComboItem(hCombo:HWND; const Text:string; data:DWORD);


  var


    nIndex : integer;


  begin


    nIndex := SendMessage(hCombo, CB_ADDSTRING, 0, LongInt(PChar(Text)));


    SendMessage(hCombo, CB_SETITEMDATA, nIndex, data);


  end;


 


然后在AdjustDlg函数的末尾添加如下的代码:


  InsertComboItem(wndCombo, '''''''', CSIDL_DESKTOP);


  InsertComboItem(wndCombo, '''''''', CSIDL_FAVORITES);


  InsertComboItem(wndCombo, '''''''', CSIDL_STARTMENU);


  InsertComboItem(wndCombo, '''''''', CSIDL_DRIVES);


  InsertComboItem(wndCombo, ''''c:\'''', 555);


  InsertComboItem(wndCombo, ''''d:\winnt'''', 555);


  InsertComboItem(wndCombo, ''''c:\windows\system'''', 555);


这里用555并没有什么特别的意义。我本来想用0来标志普通文件夹,但后来发现CSIDL_DESKTOP正是定义为0,所以必须用其他数字来区分。555是我信手写的,你当然可以用别的数字,只要注意不要和预定义的CSIDL常量冲突即可。


 


AdjustDlg函数的内容就这么多。接下来是NewBrowseProc函数的内容,它的基本结构如下:


function NewBrowseProc(AWnd:HWND; uMsg:UINT; wp:WPARAM; lp:LPARAM):LongInt; stdcall;


begin


  Result := 0;


case uMsg of



  end;


  if Assigned(OldBrowseProc) then


    Result := OldBrowseProc(AWnd, uMsg, wp, lp);

上一页  [1] [2] [3] [4]  下一页


[常用软件]Window Media Player 播放器  [Delphi程序]Window SubClassing之另类运用(之一)
[Delphi程序]override deal with window closing in database …  [Delphi程序]Window 消息大全使用详解
[网页制作]Chromeless Window For IE6 SP1  [网页制作]关于Web设计、开发中window对象的资料
[Web开发]JavaScript : WINDOW FOR JAVASCRIPT  [Web开发]JavaScript关于window.open()应用
[Web开发]关于Web设计、开发中window对象的资料  [Web开发]Javascript:window对象的方法
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台