線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1285
推到 Plurk!
推到 Facebook!

重绘图标缓存

答題得分者是:dllee
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-23 11:12:51 IP:211.162.xxx.xxx 未訂閱
小弟将使用Delphi写的重绘图标缓存代码转移到BCB中,发现在BCB中没有达到原来的效果: 下面是原来能实现重绘图标缓存的Delphi代码: uses   ......,Registry; //要包含它    ... procedure TForm1.Button1Click(Sender: TObject); var         MyIcon: integer; begin         MyIcon := GetSystemMetrics(SM_CXICON);          with TRegIniFile.Create('Control Panel\Desktop') do           try             WriteString('WindowMetrics','Shell Icon Size',IntToStr(MyIcon - 1));             SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,0);             WriteString('WindowMetrics','Shell Icon Size',IntToStr(MyIcon));             SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,0);           finally             Free;           end; end; 接着是我转移到BCB后的代码: 在头文件中包含 #include  单元文件中 void __fastcall TForm1::Button1Click(TObject *Sender) { int MyIcon; MyIcon = GetSystemMetrics(SM_CXICON); TRegistryIniFile *RegIni = new TRegistryIniFile("Control Panel\Desktop"); try { RegIni->WriteString("WindowMetrics", "Shell Icon Size", IntToStr(MyIcon - 1)); SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, 0); RegIni->WriteString("WindowMetrics", "Shell Icon Size", IntToStr(MyIcon)); SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, 0); } __finally { delete RegIni; } } 在BCB中的这段代码编译和运行的时候都不会出错,但就是不能实现原来Delphi中能实现的效果,它只是刷新桌面,但就是不重绘图标缓存,我想肯定是BCB中的这段代码有问题,但是我实在是找不出来,还请大家能指出我的错误,万分感谢了!!! 人生在勤,不索何获?
------
人生在勤,不索何获?
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-23 21:35:44 IP:61.224.xxx.xxx 未訂閱
引言: 小弟将使用Delphi写的重绘图标缓存代码转移到BCB中,发现在BCB中没有达到原来的效果: 下面是原来能实现重绘图标缓存的Delphi代码:
uses
  ......,Registry; //要包含它    ...
procedure TForm1.Button1Click(Sender: TObject);
var
        MyIcon: integer;
begin
        MyIcon := GetSystemMetrics(SM_CXICON); 
        with TRegIniFile.Create('Control Panel\Desktop') do
          try
            WriteString('WindowMetrics','Shell Icon Size',IntToStr(MyIcon - 1));
            SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,0);
            WriteString('WindowMetrics','Shell Icon Size',IntToStr(MyIcon));
            SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,0);
          finally
            Free;
          end;
end;
接着是我转移到BCB后的代码: 在头文件中包含
#include 
单元文件中
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        int MyIcon;
        MyIcon = GetSystemMetrics(SM_CXICON);            TRegistryIniFile *RegIni = new TRegistryIniFile("Control Panel\Desktop");            try
        {
            RegIni->WriteString("WindowMetrics", "Shell Icon Size", IntToStr(MyIcon - 1));
            SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, 0);
            RegIni->WriteString("WindowMetrics", "Shell Icon Size", IntToStr(MyIcon));
            SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, 0);
        }
        __finally
        {
            delete RegIni;
        }
}
在BCB中的这段代码编译和运行的时候都不会出错,但就是不能实现原来Delphi中能实现的效果,它只是刷新桌面,但就是不重绘图标缓存,我想肯定是BCB中的这段代码有问题,但是我实在是找不出来,还请大家能指出我的错误,万分感谢了!!! 人生在勤,不索何获?
看起來有問題的地方只有「字串」 TRegistryIniFile *RegIni = new TRegistryIniFile("Control Panel\\Desktop"); 在 C/C 中,要表示 \ 在雙引號內要用 "\\" 例如:"C:\\Windows\\System32\\" 來表示 C:\Windows\System32\ 目錄路徑。 因為 SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, 0); 有正常發出,所以您會看到刷新桌面。 對了,提醒您,在 post 程式原始碼時,可以用 {code} 程式原始碼{/code} 將 code 包起來,那內縮的效果才會保留,這樣別人才容易看懂您的問題。請將 {code} 的 { } 改 [ ] 或是在發表文章時,按一下格式按鈕中的 「#」按鈕。可以先到 發言測試區 http://delphi.ktop.com.tw/forum.asp?FORUM_ID=911 去測試一下。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell.... 發表人 - dllee 於 2003/06/23 22:00:58
------
http://www.ViewMove.com
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-23 22:32:56 IP:211.162.xxx.xxx 未訂閱
真是感谢dllee大哥,的确是您指出的那个问题,谢谢,很感激您!我的问题每次都是由您做出了满意的回答 人生在勤,不索何获?
------
人生在勤,不索何获?
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-05 21:52:12 IP:211.162.xxx.xxx 未訂閱
dll大大,我再冒昧问您一些类似的问题: 在BCB中,比如AnsiString str1 = "KTop"是代表str1被赋值,其内容是(KTop),那如果是AnsiString str1 = 'KTop'又是代表什么意思呢? 还有为什么有时要对char数组进行大小的确定呢,另我疑惑的代码如下:
AnsiString GetText(HWND hWnd)        
{
     AnsiString Text;
     if(hWnd)
     {
        char *buf;
        int Length = (int)SendMessage(hWnd,WM_GETTEXTLENGTH,0,0); //得到文本的长度
        if(Length)
        {
            buf = new char[Length   2];  //当我把Length   2替换为MAX_PATH或者256时,就莫名其妙的出问题,是不是真的要确定其大小呢
            buf[Length]     = '\0';
            buf[Length   1] = '\0';  //我把这里的'\0'换成了"\0",就出现编译时错误,说是: Cannot convert 'char *' to 'char',它的意思是不是说对指针赋值不能直接用" "的形式,还有这里加\0干嘛?
            SendMessage(hWnd,WM_GETTEXT,Length   1,(LPARAM)buf);
            Text = buf;
            delete buf;
         }
     }
     return Text;
}
再比如: [code] HWND hDesktop = GetDesktopWindow(); AnsiString tmp; TTreeNode *Root = TreeView1->Items->Add(NULL,tmp); Root->Data = (void *)hDesktop; //我就是不能理解这样赋值也能行的道理,hDesktop是一个unsigned int型的啊,是被强制转化为void *型的了吗?这样也行啊?帮助中不是写了__property void * Data = {read=FData, write=SetData}的吗? dllee大大,又麻烦您了,问题提的比较弱智,请原谅我这个菜鸟的无知 人生在勤,不索何获?
------
人生在勤,不索何获?
系統時間:2024-05-03 20:48:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!