星期日, 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」一次。