2011/05/28

[vc6]修改編輯器字型

1.透過IDE本身的Tools->Options->Format,你可以依照Category的分類,來決定Font、Size跟Colors
不過小弟大多只改Category:Source Windows而已......


2.偏偏我不愛用內建字型,但是方法1能選擇的Font又非常有限,所以這時候就要透過修改regedit來改註冊檔了~
regedit打開後點選 HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Source Window\FontFace 按右鍵->修改,把數值資料改為你想要用的字型名稱即可。
跟FontFace同一層有個FontSize,你也可以順便把字體放大一點~


ps.要是找不到DevStudio\6.0\Format,請先用方法1隨便選一個設定,讓VS6去寫註冊檔,再用方法2去改。


以上~

2011/05/27

[vc6]Button物件顯示Tip

1. 開啟MFC專案後,點選 project-> add   to   project-> component   and   controls-> 選擇 C:\Program Files\Microsoft Visual Studio\COMMON\MSDev98\Gallery\Visual C++ Components-> ToolTip   Support
,然後按Insert,即可將此物件插入本專案。
2. 插入後,在OnInitDialog()內會自動產生一段代碼
<code>

// CG: The following block was added by the ToolTips component.
{
// Create the ToolTip control.
m_tooltip.Create(this);
m_tooltip.Activate(TRUE);

// TODO: Use one of the following forms to add controls:
// m_tooltip.AddTool(GetDlgItem(IDC_<name>), <string-table-id>);
// m_tooltip.AddTool(GetDlgItem(IDC_<name>), "<text>");
}

</code>
假設你要的功能是當滑鼠游標移到"確定"按鈕上能顯示"我確定!"的Tip時,請將預設的
// m_tooltip.AddTool(GetDlgItem(IDC_<name>), "<text>");
修改為
m_tooltip.AddTool(GetDlgItem(IDOK),   "我確定! ");
就算大功告成了~

ps1. m_tooltip.AddTool不一定要在InitialDialog中才能做,如果你有手動創建CButton類,也可以在創建完成後,再替button物件增加tip。
ps2. m_tooltip.AddTool 可以針對同一個ItemID新增不只一次的Tip,但是畫面只會顯示最後一次所設定的tip內容。

以上~

2011/05/26

[vc6]Load Icon File

參考網址:MSDN:About Icons
Icon有分四種尺寸

  • System small
  • System large
  • Shell small
  • Shell large
System small的意思:
顯示在視窗標題列上的Icon尺寸就是System small。


System large的意思:
(圖我cut不出來,請前輩賜教!)
當你按鍵盤alt+tab組合鍵時,會跳出一個切換應用程式的視窗,視窗上面有每個應用程式自己的Icon,這個Icon的尺寸就是System large。


Shell small的意思:
在檔案總管理面看到的notepad icon尺寸Shell small。
(關於這點其實我不是很確定,因為在檢視裡面可以選擇"縮圖"、"並排"、"圖示"、"清單"、"詳細資料"五種不同的檢視方式,而這五種都會使icon尺寸產生變化,知道的前輩再請告知,謝謝^^)


Shell large的意思:
桌面上的圖示尺寸即是Shell large。


----------------------------------------我是分隔線----------------------------------------
在來說一下怎麼把icon抓出來吧~
方法一:
<code>

{//Load Icon
HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL);
SHFILEINFO sfi;
ZeroMemory(&sfi,sizeof(SHFILEINFO));
SHGetFileInfo("C:\\windows\\system32\\notepad.exe",
 0,
 &sfi,
 sizeof(SHFILEINFO),
 SHGFI_ICON | SHGFI_SMALLICON);
HICON g_icon = sfi.hIcon;


m_btnP1.SetWindowPos(NULL,0,0,32,32,SWP_SHOWWINDOW);
m_btnP1.SetIcon(g_icon);
}

</code>
SHGetFileInfo的第五個參數:看你要哪一種icon,範例是用system small,也有SHGFI_LARGEICON。
如果SHFILEINFO::hIcon return為NULL,可能是沒有這個icon,或是第五個參數下錯。


方法二:
<code>

{
HICON phIcon;
phIcon = ::ExtractIcon((HINSTANCE)GetCurrentProcess(), "C:\\windows\\system32\\notepad.exe",(UINT)0);
if(!phIcon)return;
m_btnP1.SetIcon(phIcon);
m_btnP1.SetWindowPos(this,0,0,36,36,SWP_NOZORDER);
}

</code>
ExtractIcon的最後一個參數:可以決定要抓這個檔案的第幾個icon,0 抓第一張,以此類推。


方法三:
<code>

{
HICON phIconLarge,phIconSmall;
int total = ::ExtractIconEx("C:\\windows\\system32\\notepad.exe",0,&phIconLarge,&phIconSmall,1);


m_btnP1.SetIcon(phIconLarge);
m_btnP1.SetWindowPos(this,0,0,36,36,SWP_NOZORDER);
m_btnP2.SetIcon(phIconSmall);
m_btnP2.SetWindowPos(this,40,0,20,20,SWP_NOZORDER);
}

</code>
ExtractIconEx第二個參數帶-1,回傳值表示這個檔案有幾張icon,帶0,回傳的數字表示是第幾張icon,但我不確定是large的還是small的index。


reference:
MSDN:SHGetFileInfo
MSDN:ExtractIcon
MSDN:ExtractIconEx
以上~

[vc6]如何看DLL內的function name and point

之前有廠商給了DLL,可是怎麼Load都無法使用,所以需要透過工具去看DLL內是否有定義好export。

正常的DLL看起來像這樣:

















異常的看起來像這樣:

















差異在於funcion那邊會看到奇怪的名字,所以就無法使用。

看DLL的工具可以參考這篇網誌:[微軟]使用 Dependency Walker 工具,檢查程式與 DLL 的相依性

ps.使用dependency walker開啟dll時,dll的檔案路徑不可包含中文!

[vc6]視窗透明化

最近在製作產品,剛好需要這個功能,所以把參考網址跟code貼出來,當作筆記。


<Code>
//設定半透明效果
//1.加入WS_EX_LAYERED擴展屬性
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
//2.載入User32.dll
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{  //3.先定義一個函數,等一下要拿來接User32.dll內的"SetLayeredWindowAttributes" function point
    typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
    //4.宣告一個型態為MYFUNC的變數fun
    MYFUNC fun = NULL;
    //5.取得SetLayeredWindowAttributes函數指針
    fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
    //6.如果有找到"SetLayeredWindowAttributes"這個function的位址,就開使用吧~
    if(fun)fun(this->GetSafeHwnd(),0,160,2);//param 3:0->全透明,255->不透明
    //7.用完記得釋放Library
    FreeLibrary(hInst);
}
</Code>
SetLayeredWindowAttributes 的用法
第一個參數:要透明化的那個視窗的 window  handle
第二個參數:可以用RGB(255,255,255),則視窗上白色的地方會變透明
第三個參數:0(全透明,會完全看不到)~255(不透明)
第四個參數:LWA_ALPHA(0x00000002)跟參數3搭配使用
LWA_COLORKEY(0x00000001)跟參數2搭配使用-->針對特定顏色的透明化

詳細請參考 msdn說明

以上~