星期日, 12月 28, 2008

[美工] 等寬字型-for window

等寬字型有時不慎美觀 但是也有人喜歡整齊

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. 標楷體

[程式設計] 不用暫存變數的Swap-限整數

  
void SwapAB(int a, int b)
{
a=a+b;
b=a-b;
a=a-b;
}

星期日, 11月 30, 2008

[C++] 數據類型轉換

程式設計一定會碰到的問題之一:類型轉換,但是遇到的時候要怎麼解決,卻只能慢慢試,不是好辦法。這裡有個強者整理出來的方法,可以用來參考。
數據類型轉換整理(全)

星期二, 11月 18, 2008

[知識] KMP Alogorithm

KMP演算法為一個利用Failure Function(Prefetch Table)的字串比對演算法。時間複雜度為O(Pattern Length+Target Length)。

此演算法最麻煩的部分在於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值+1]比。相同則Failure值+1,不同時則再跟P[0]比,相同則為0,再不同時則為-1。

星期一, 10月 20, 2008

[程設]程式設計師的格言

想當程式設計師的人都應該先看看這一份文件
不過,我想沒當過程式設計師的人,應該有八成都看不懂。
就像沒當過兵的人很難理解POA是甚麼。
程式設計師的格言

星期三, 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月 09, 2008

[MFC] GDI+ 使用

在 stdafx.h中加入下列code

#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#include "include\gdiplus.h"
using namespace Gdiplus;

星期三, 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訊息。

星期三, 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版一樣。

星期二, 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
優點:可屏蔽雙擊標題列

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;
}
}

2.加在初始化函式
(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
缺點:系統選單不會消失

星期五, 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...)

星期二, 6月 05, 2007

[VC6] Cannot add new member

有時在Resource View中,點擊控制項要增加函式時,會出現此訊息。
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