星期六, 5月 22, 2010

[心情] 我和她

在我與妳的世界中有著一條虛數軸,看不見。卻一直引領著我離妳越來越遠。

星期四, 4月 01, 2010

[旅遊] 2010-04-01 平溪一日遊

花費:
    食:早餐-飯糰15+飲料20 午餐-肉絲蛋炒飯50 晚餐-東北角70 飲料-20*2
    行:車票-平溪來回 240 菁桐往平溪-15*2
    其他:十分瀑布門票-70
    總計:535元

感想:
還算可以,感覺很多人出來會比較好玩。太陽太大很熱,不過沒太陽時風景又很難拍。說到老街,其實大部分都給人一個感覺,就是賣的都是玩的,吃的。其實從來就不曾喜歡過。與其說是到平溪逛老街,我想,是跟朋友一起出去的感覺成分居多。
比較好的是風景,天氣好的話拍起來真的很不錯。例如下面的瀑布。而最重要的 一點,雖然太陽光很重要,不過太亮也不好。所以最好準備減光鏡或是偏光鏡,這樣才能拍出更好看的照片。
十分瀑布

星期日, 1月 04, 2009

[MFC] CSrollView的 ScrollBar

1 OnInitialUpdate()函式裡的sizeTotal.cx=sizeTotal.cy 值要設定

2. CSize sizeTotal(Getx(),Gety());
SetScrollSizes(MM_TEXT, sizeTotal);

[VS2005] 怎樣添加事件、映射消息和重載函數

VS2005 的 MFC 添加事件、映射消息和重載函數的操作 和 VS6.0 不一樣,是在類別的屬性頁裡。操作如下:

在「類別檢視」中,右鍵單擊想要操作的類別,點擊「屬性」。在打開的屬性頁中,最上一排按鈕中的「事件」、「訊息」和「覆寫」分別對應「添加事件」、「映射消息」和「重載函數」的操作。

星期六, 1月 03, 2009

[MFC] 全螢幕功能-開始工作列未消失

原因是OnGetMinMaxInfo這個函式沒有被OverRide,
,最好是用ClassWizard,不要用手動。因為很可能會沒有效果。
要重寫此函式的原因如下:

程序中有一個地方要說明一下,那就是OnGetMinMaxInfo函數的作用。你可以試一下,如果把這個函數去掉,則當你按下工具欄中的全屏顯示按鈕時,框架視圖確實變大了,但沒有想像的那樣實現全屏顯示,底邊留下一個狀態欄——一個有些發育不良的全屏顯示窗口。為什麼會這樣呢?經過調試後,發現問題出在WM_GETMINMAXINFO消息的處理上。在Windows中,無論什麼時候以何種方式改變窗口的尺寸或大小,是拖拽窗口邊緣也好,或是在代碼中調用改變窗口尺寸的函數也好,總之不管你用什麼方法,Windows都會首先發送WM_GETMINMAXINFO消息。這個消息的意思是說:「嘿,如果你要強迫我的尺寸變大或變小,就附上詳細的MINMAXINFO結構信息,否則我用默認值處理。」大多數應用程序都不用顯式處理這個 WM_GETMINMAXINFO消息(也就是說讓DefWindowProc窗口過程進行缺省處理),而Windows在進行缺省處理時是不會讓一個窗口視圖比屏幕還大的,所以我們會碰上前面講的那個問題。解決的方法是:不要讓Windows對WM_GETMINMAXINFO消息進行缺省處理,而是由我們自己處理,方法如下:

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
{
 if (m_bFullScreen)
 {
  lpMMI->ptMaxSize.y = m_FullScreenWindowRect.Height();
  lpMMI->ptMaxTrackSize.y = lpMMI->ptMaxSize.y;
  lpMMI->ptMaxSize.x = m_FullScreenWindowRect.Width();
  lpMMI->ptMaxTrackSize.x = lpMMI->ptMaxSize.x;
 }
 //CFrameWnd::OnGetMinMaxInfo(lpMMI);
}

星期四, 1月 01, 2009

JPEG 壓縮簡介

/************************************************************************

JPEG 壓縮簡介
-------------

1. 色彩模型

JPEG 的圖片使用的是 YCrCb 顏色模型, 而不是計算機上最常用的 RGB. 關於色
彩模型, 這裡不多闡述. 只是說明, YCrCb 模型更適合圖形壓縮. 因為人眼對圖片上
的亮度 Y 的變化遠比色度 C 的變化敏感. 我們完全可以每個點保存一個 8bit 的亮
度值, 每 2x2 個點保存一個 Cr Cb 值, 而圖像在肉眼中的感覺不會起太大的變化.
所以, 原來用 RGB 模型, 4 個點需要 4x3=12 字節. 而現在僅需要 4+2=6 字節; 平
均每個點佔 12bit. 當然 JPEG 格式裡允許每個點的 C 值都記錄下來; 不過 MPEG 裡
都是按 12bit 一個點來存放的, 我們簡寫為 YUV12.

星期日, 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。打開它,你就可以看到原來的信件內容了。