等寬字型有時不慎美觀 但是也有人喜歡整齊
1. Courier
2. Courier New
3. Lucida Console
4. Fixedsys
5. Terminal
6. MS Gothic
7. MS Mincho
8. BatangChe
9. DotumChe
10. GulimChe
11. GungsuhChe
12. NSimSun
13. SimHei
14. SimSun
15. 細明體
16. 標楷體
星期日, 12月 28, 2008
星期日, 11月 30, 2008
星期二, 11月 18, 2008
[知識] KMP Alogorithm
KMP演算法為一個利用Failure Function(Prefetch Table)的字串比對演算法。時間複雜度為O(Pattern Length+Target Length)。
此演算法最麻煩的部分在於Failure Function的建立。程式碼如下:
手動建立要訣為:(P指Pattern,T指Prefetch Table)
1. 首先(即P[1],因為T[0]必為-1)跟P[0]比對,相同為0(即P[0]+1),不同為-1。
2. 接著,繼續比對時如果前面Failure值為-1,則跟P[0]比,如果不是則跟P[Failure值+1]比。相同則 Failure值+1,不同時則再跟P[0]比,相同則為0,再不同時則為-1。
此演算法最麻煩的部分在於Failure Function的建立。程式碼如下:
void fail2(char *pat)
{
int cnt,pos=0;
int n=strlen(pat);
T[0]= -1;
for(pos=1; pos=0)
{
cnt=T[cnt];
if(pat[pos] == pat[cnt+1])//現在的比對文字 與前一格的Failure Value+1相同
T[pos] = cnt+1;
else
T[pos]=-1;
}
}
手動建立要訣為:(P指Pattern,T指Prefetch Table)
1. 首先(即P[1],因為T[0]必為-1)跟P[0]比對,相同為0(即P[0]+1),不同為-1。
2. 接著,繼續比對時如果前面Failure值為-1,則跟P[0]比,如果不是則跟P[Failure
星期一, 10月 20, 2008
星期三, 5月 07, 2008
[MFC] 攔截 ESC 鍵 或是其他鍵盤指令
基於Cdialog類別所寫出的視窗類別,預設當使用者按下Enter或Esc鍵時,會關閉視窗程式。如果要關閉此功能,需重載PreTranslateMessage函式。改寫如下:
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case VK_RETURN:
case VK_ESCAPE:
return TRUE;
break;
default:
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
星期四, 4月 10, 2008
星期三, 4月 09, 2008
[MFC] GDI+ 使用
在 stdafx.h中加入下列code
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#include "include\gdiplus.h"
using namespace Gdiplus;
星期一, 4月 07, 2008
星期三, 3月 26, 2008
[C] 甚麼是函數指標
函數指標 (function pointer) 是一種「指向函數的指標」,和一般指向資料的指標不同。凡是研究過許多系統原始碼 (例如:Linux Kernel、Borland OWL) 的人,對於函數指標應該都不陌生,因爲多數低階系統都使用 C 語言撰寫,而函數指標是傳統C語言中少數的動態機制,有許多不可取代的地方,所以這些 C 原始碼中到處可見函數指標。
透過一個實際的範例,來瞭解何謂函數指標:
參考來源 函數指標的進化論 (上)
透過一個實際的範例,來瞭解何謂函數指標:
// FncPtr.cpp
#include
using std::cin;
using std::cout;
using std::endl;
// 聲明 Fnc1(), Fun2(), Twice()
float Fnc1(int);
float Fnc2(int);
double Twice(float (*)(int), int);
// 主程式
int main() {
int A = 3;
int B = 5;
count << "Twice(Fnc1, A)的值為: "
<< Twice(Fnc1, A) << endl;
count << "Twice(Fnc2, B)的值為: "
<< Twice(Fnc2, B) << endl;
}
float Fnc1(int N) {
return float (N*N);
}
float Fnc2(int N) {
return float (N*N*N);
}
double Twice(float (*pF)(int), int N) {
return 2.0 * double(pF(N));
}
執行結果:Twice(Fnc1, A)的值為:18 Twice(Fnc2, B)的值為:250此例中,pF 即為函數指標,而函數名稱本身 (Fun1 與 Fun2) 是常數的函數指標。通過函數指標,函數被資料化了 (變成指標),如此一來函數也可以被傳遞、被紀錄,所以 Fnc1 與 Fnc2 可以被當成參數,傳進 Twice() 中。
參考來源 函數指標的進化論 (上)
星期一, 1月 28, 2008
[MFC] 一次Double Click 所包含的滑鼠訊息到底是哪些?
根據實驗所得,一次Doulbe Click包含 一次Down、一次Double Click以及兩次Up訊息。
利用Spy++得到的結果也是一樣。順序是"Down -> Up -> Double Click -> Up" 。
經過實際測試程式後,發現應該是Windows根據滑鼠第二次Click跟上一次Click的位置有無相同與時間有無接近來決定發出哪一個訊息,如果都兩個條件都成立則第二次Click就不會發出Button Down訊息,而改發DoubleClick訊息,但Button Up訊息則不受影響。所以說,如果視窗接收到Double Click訊息,就表示前面一定已經發出一個Button Down訊息。
利用Spy++得到的結果也是一樣。順序是"Down -> Up -> Double Click -> Up" 。
經過實際測試程式後,發現應該是Windows根據滑鼠第二次Click跟上一次Click的位置有無相同與時間有無接近來決定發出哪一個訊息,如果都兩個條件都成立則第二次Click就不會發出Button Down訊息,而改發DoubleClick訊息,但Button Up訊息則不受影響。所以說,如果視窗接收到Double Click訊息,就表示前面一定已經發出一個Button Down訊息。
星期三, 1月 23, 2008
[VC] 使用技巧
1.如何快速地規範程式碼縮排格式
選中所需要規範的程式碼,按shift+F8
2. 如何在Release狀態下進行調試
Project->Setting=>ProjectSetting對話框,選擇Release狀態。C/C++標籤中的Category選General,Optimizations選Disable(Debug),Debut info選Program Database。在Link標籤中選中Generate debug info復選框。
註:只是一個介乎Debug合Release的中間狀態,所有的ASSERT、VERIFY都不起作用,函數調用方式已經是真正的調用,而不查表,但是這種狀態下QuickWatch、調用隊列跟蹤功能仍然有效,和Debug版一樣。
選中所需要規範的程式碼,按shift+F8
2. 如何在Release狀態下進行調試
Project->Setting=>ProjectSetting對話框,選擇Release狀態。C/C++標籤中的Category選General,Optimizations選Disable(Debug),Debut info選Program Database。在Link標籤中選中Generate debug info復選框。
註:只是一個介乎Debug合Release的中間狀態,所有的ASSERT、VERIFY都不起作用,函數調用方式已經是真正的調用,而不查表,但是這種狀態下QuickWatch、調用隊列跟蹤功能仍然有效,和Debug版一樣。
星期二, 1月 22, 2008
[VC6] 如何解決一直重新全部編譯的問題
此問題的發生,在於鏈結動作出現問題。這是因為出現了未來文件(修改時間和修改時間比系統時間晚)的緣故。可以這樣處理:找到工程文件夾下的debug目錄,將創建和修改時間都比系統時間的文件全部刪除,然後再重新「Rebuild All」一次。
星期五, 12月 21, 2007
如何合併被Outlook Express分割的信件
1.將被分割的信件內容完整複製到一個新的純文字檔,檔名依照順序命名為1.dat 2.dat .....。
2.然後新增一個批次檔,內容為
copy /b 1.dat+2.dat all.eml.
3.執行批次檔。
然後就可以看到一個新檔案all.eml。打開它,你就可以看到原來的信件內容了。
星期三, 7月 18, 2007
[MFC] Disable 關閉按鈕
有三種方法
1. 重載 CMainFrame::PreTranslateMessage 如下
缺點:按鈕還是顯示Enable
優點:可屏蔽雙擊標題列
(m_pMainWnd->GetSystemMenu(FALSE))->RemoveMenu(SC_CLOSE,MF_BYCOMMAND);
優點:簡單, 標題列按鈕會顯示Disable
缺點: 只能屏蔽系統選單及標題列
3.::SetClassLong(m_pMainWnd->GetSafeHwnd(),GCL_STYLE,::GetClassLong(m_pMainWnd->GetSafeHwnd(),GCL_STYLE) |CS_NOCLOSE);
優點:簡單, 標題列按鈕會顯示Disable
缺點:系統選單不會消失
1. 重載 CMainFrame::PreTranslateMessage 如下
缺點:按鈕還是顯示Enable
優點:可屏蔽雙擊標題列
2.加在初始化函式
if(pMsg->hwnd == this->m_hWnd )
{
if (pMsg->message == WM_SYSCOMMAND)
{
if (pMsg->wParam == SC_MINIMIZE)
return true;
if (pMsg->wParam == SC_CLOSE)
return true;
}
if (pMsg->message == WM_NCLBUTTONDBLCLK)
return true;
if (pMsg->message == WM_NCLBUTTONDOWN)
{
if (pMsg->wParam == HTMINBUTTON)
return true;
if (pMsg->wParam == HTSIZE)
return true;
if (pMsg->wParam == HTCLOSE)
return true;
}
}
(m_pMainWnd->GetSystemMenu(FALSE))->RemoveMenu(SC_CLOSE,MF_BYCOMMAND);
優點:簡單, 標題列按鈕會顯示Disable
缺點: 只能屏蔽系統選單及標題列
3.::SetClassLong(m_pMainWnd->GetSafeHwnd(),GCL_STYLE,::GetClassLong(m_pMainWnd->GetSafeHwnd(),GCL_STYLE) |CS_NOCLOSE);
優點:簡單, 標題列按鈕會顯示Disable
缺點:系統選單不會消失
星期一, 7月 16, 2007
星期五, 6月 15, 2007
[MFC] Image/ Color Bottons 連結整理
要讓一個程式好看又好用,有時漂亮的按鈕不可少。以下為從兩個國外有名的VC程式站抓來的相關連結。因為實在懶得再一個一個去找了。
1. Colored buttons
2. Enhanced Colored Button
3. ImageTextButton
4. Colored Buttons
5. Image Button Control
6. Transparant Image Button (BMP, GIF, JPG...)
1. Colored buttons
2. Enhanced Colored Button
3. ImageTextButton
4. Colored Buttons
5. Image Button Control
6. Transparant Image Button (BMP, GIF, JPG...)
星期二, 6月 05, 2007
[VC6] Cannot add new member
有時在Resource View中,點擊控制項要增加函式時,會出現此訊息。
1.修正此錯誤的方法為,在類別檢視器中尋找有無重複類別,如果有就移除掉。如果沒有,也移除掉。
2.刪除相對應的cpp、h檔,再重新加入。
3.打開Class Wizard,重新對應Class及cpp/h檔。
4.重新開啟Project。
1.修正此錯誤的方法為,在類別檢視器中尋找有無重複類別,如果有就移除掉。如果沒有,也移除掉。
2.刪除相對應的cpp、h檔,再重新加入。
3.打開Class Wizard,重新對應Class及cpp/h檔。
4.重新開啟Project。
星期三, 5月 30, 2007
[VC] 快捷鍵整理
Ctrl+O :Open
Ctrl+P :Print
Ctrl+N :New
Ctrl+Shift+F2 :清除所有書籤
F2 :上一個書籤
Shift+F2 :上一個書籤
Alt+F2 :編輯書籤
Ctrl+F2 :添加/刪除一個書籤
F12 :Goto definition
Shift+F12 :Goto reference
Ctrl+P :Print
Ctrl+N :New
Ctrl+Shift+F2 :清除所有書籤
F2 :上一個書籤
Shift+F2 :上一個書籤
Alt+F2 :編輯書籤
Ctrl+F2 :添加/刪除一個書籤
F12 :Goto definition
Shift+F12 :Goto reference
星期五, 5月 25, 2007
訂閱:
意見 (Atom)