如果編譯後出現 LNK4770 的錯誤,則需要手動更改 MyDll.def 檔中的 LIBRARY,將後面改為需要的輸出檔名。 之後再編譯即可得到對應的 lib 與 dll 檔。
星期四, 4月 24, 2014
[VC6] 變更 DLL 名稱
要改變 DLL 檔的檔名除了在 [Link] -> [Category:General] -> Output file name 改名稱以外。
如果編譯後出現 LNK4770 的錯誤,則需要手動更改 MyDll.def 檔中的 LIBRARY,將後面改為需要的輸出檔名。 之後再編譯即可得到對應的 lib 與 dll 檔。

如果編譯後出現 LNK4770 的錯誤,則需要手動更改 MyDll.def 檔中的 LIBRARY,將後面改為需要的輸出檔名。 之後再編譯即可得到對應的 lib 與 dll 檔。
星期六, 4月 19, 2014
[Qt] 編譯 libqxt on Qt5
前言:因為某個專案需要用到 libqxt,且因為我先安裝了 Qt 5.2.1,所以如何將 libqxt 加入到專案裏著實讓我困擾了一陣子。找了很久才終於讓我找到 編譯 libqxt 的方法,也讓專案順利編譯出來。
為什麼這麻煩的原因在於 libqxt 原先只支援 Qt4 而不支援 Qt5,因此要使用在 Qt5上一定要重新編譯。編譯方法主要參考 How to Use LibQxt with Qt Creator 這篇文章,另外在專案修改的部份則參考 Handling_CSV ,此文也可在前面的文章中連結到。
環境: Qt5.2.1 on Windows 7 32bit
以下為 How to Use LibQxt with Qt Creator 中的編譯方法簡介:
1. 首先至 libqxt 官網下載 master 分支。下載頁 直接下載Master.zip
2. 解壓縮後建議更改目錄檔名為 libqxt-qt5 並將其與 Qt5.2.1 一起放置在 Qt 目錄下,如下圖。
這樣作的好處是之後容易識別。因為原先的目錄名稱後面為一串無法閱讀的編碼 。
3. 確定 qmake 與 mingw32-make的執行目錄,被寫在系統環境變數 PATH 中 。在我的環境中分別為 C:\Qt\Qt5.2.1\5.2.1\mingw48_32\bin 與 C:\Qt\Qt5.2.1\Tools\mingw48_32\bin 。
接著在 libqxt-Qt5 的目錄中,按住 shift 鍵,滑鼠右鍵點擊目錄空白處。在出現的功能選單中,選擇 在此處開啟命令視窗 ,接著在命令視窗中,依序鍵入下列指令。
(1) configure.bat
(2) mingw32-make
如下圖所示

然後等個數分鐘。libqxt 就編譯完了 。
4. 然後分別將以下目錄中的 所有.h 檔(即標頭檔)從前面的目錄複製到後面的指定目錄。如下所示:
- C:\Qt\libqxt-Qt5\src\bdb -> C:\Qt\libqxt-Qt5\include\Qxtbdb
C:\Qt\libqxt-Qt5\src\designer -> C:\Qt\libqxt-Qt5\include\QxtCore
C:\Qt\libqxt-Qt5\src\network -> C:\Qt\libqxt-Qt5\include\QxtNetwork
C:\Qt\libqxt-Qt5\src\sql -> C:\Qt\libqxt-Qt5\include\QxtSql
C:\Qt\libqxt-Qt5\src\web -> C:\Qt\libqxt-Qt5\include\QxtWeb
C:\Qt\libqxt-Qt5\src\widgets -> C:\Qt\libqxt-Qt5\include\QxtWidgets
C:\Qt\libqxt-Qt5\src\zeroconf -> C:\Qt\libqxt-Qt5\include\QxtZeroconf
Windows 7 的使用者可以利用資料夾的分組方式功能,以類型分組來快速選取所有的 .h 檔案。
5. 接著在 .pro 專案檔中加入以下兩個部份。首先加入
CONFIG += qxt
QXT += core gui
接著依照中專案中所引用的函式而定再加入下列文字,若有引用其他不同的部份再修改紅色部份即可。
win32:CONFIG(release, debug|release): LIBS += -LC:/Qt/libqxt-Qt5/lib/ -lqxtcore
else:win32:CONFIG(debug, debug|release): LIBS += -LC:/Qt/libqxt-Qt5/lib/ -lqxtcore
INCLUDEPATH += C:/Qt/libqxt-Qt5/src/core
或 INCLUDEPATH += C:\Qt\libqxt-Qt5\include\QxtCore
DEPENDPATH += C:/Qt/libqxt-Qt5/src/core
星期五, 9月 21, 2012
[MFC] 取得記憶體使用量
psapi.h 為SDK內含的檔案,只安裝過 Visual C++ 的話,須另外下載。
#include "windows.h"
#include "stdio.h"
#include "psapi.h"
#include "windows.h"
#include "stdio.h"
#include "psapi.h"
#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "psapi.lib")
int main(int argc, char *argv[]) {
PROCESS_MEMORY_COUNTERS pmc;
/*
your code here
*/
GetProcessMemoryInfo( GetCurrentProcess(), &pmc, sizeof(pmc)); //get memory usage
cout <<"memory usage:" << pmc.PeakWorkingSetSize << endl; //unit in bytes
}
#pragma comment(lib, "psapi.lib")
int main(int argc, char *argv[]) {
PROCESS_MEMORY_COUNTERS pmc;
/*
your code here
*/
GetProcessMemoryInfo( GetCurrentProcess(), &pmc, sizeof(pmc)); //get memory usage
cout <<"memory usage:" << pmc.PeakWorkingSetSize << endl; //unit in bytes
}
星期四, 12月 22, 2011
星期二, 11月 29, 2011
[軟體] 簡單好用的影音轉檔軟體 Moo0 VideoConverter 1.10
http://www.moo0.com/?top=http://www.moo0.com/software/VideoConverter/
這個軟體好用在於可以將mkv重新編碼,並且可以設定編碼後的檔案大小,而且畫質也不差。這樣就可以把一些超過一片DVD大小的720P重新壓成一片DVD的大小。 然後就可以把影片燒錄起來。
支援格式/ 編碼:
- 影片格式: AVI, FLV, M4V, MKV, MOV, MP4, MPG, OGG, OGV, RM, SWF, TP, TS, WEBM, WMV and many more.
- 影片編碼: H.263, H.264 (x264), Mpeg2, Mpeg4 (DivX, XviD and its own), RV10, Theora, VP8, WMV (v7, v8) and many more.
- 聲音格式 / 編碼: 3G2, 3GP, AAC, AC3, ADPCM, AIFF, AMR (NB, WB), AU, FLAC, GSM, M4A, MP3, MP4, OGG, PCM, RA, VORBIS, WAVE, WMA and many more.
這個軟體好用在於可以將mkv重新編碼,並且可以設定編碼後的檔案大小,而且畫質也不差。這樣就可以把一些超過一片DVD大小的720P重新壓成一片DVD的大小。 然後就可以把影片燒錄起來。
支援格式/ 編碼:
- 影片格式: AVI, FLV, M4V, MKV, MOV, MP4, MPG, OGG, OGV, RM, SWF, TP, TS, WEBM, WMV and many more.
- 影片編碼: H.263, H.264 (x264), Mpeg2, Mpeg4 (DivX, XviD and its own), RV10, Theora, VP8, WMV (v7, v8) and many more.
- 聲音格式 / 編碼: 3G2, 3GP, AAC, AC3, ADPCM, AIFF, AMR (NB, WB), AU, FLAC, GSM, M4A, MP3, MP4, OGG, PCM, RA, VORBIS, WAVE, WMA and many more.
星期一, 11月 28, 2011
[軟體] Moo0 VideoInfo 1.03 - 查看影片進階資訊
Moo0 VideoInfo 1.03 - 查看影片進階資訊:

在網路上蒐藏了許多影片,許多人可以將影片檔案容量變小,卻又可以保持高畫質,還真是好奇是怎樣的壓縮技術,自己轉檔一直測試的話可能要花上許多的時間,這時候可以試試看這個小軟體,能解析出影片中的所有細節資訊,在轉檔之前先學習別人的設定吧!
將影片檔案拖曳的軟體當中,就可以查看詳細的影片資訊,包含了檔案名稱、檔案大小、影片格式、影片長短、編碼方式、影片解析度與聲音等等的資訊,內容還頗多的,詳細的資訊我都還不太瞭解呢!而附加了複製資訊的功能,當分享影片的時候不如就輸出這樣的資訊,下載的人也能知道影片的狀態唷!
http://www.moo0.com/software/VideoInfo/
引用網址:http://portable.easylife.tw/trackback/2873
綠色軟體/影音視聽 2011/11/27 17:18 by 哇哇
在網路上蒐藏了許多影片,許多人可以將影片檔案容量變小,卻又可以保持高畫質,還真是好奇是怎樣的壓縮技術,自己轉檔一直測試的話可能要花上許多的時間,這時候可以試試看這個小軟體,能解析出影片中的所有細節資訊,在轉檔之前先學習別人的設定吧!
將影片檔案拖曳的軟體當中,就可以查看詳細的影片資訊,包含了檔案名稱、檔案大小、影片格式、影片長短、編碼方式、影片解析度與聲音等等的資訊,內容還頗多的,詳細的資訊我都還不太瞭解呢!而附加了複製資訊的功能,當分享影片的時候不如就輸出這樣的資訊,下載的人也能知道影片的狀態唷!
http://www.moo0.com/software/VideoInfo/
星期日, 11月 27, 2011
[MFC] 繪圖時去除閃爍
1. 專案加入 memdc.h
from Here
2. 在 stdafx.h加入下一行
#include "memdc.h"
3. 修改訊息 WM_ERASEBKGND的回應 如下:
BOOL CExampleView::OnEraseBkgnd(CDC* pDC) { return FALSE; }
4.修改OnDrae的程式碼,如下
void CExampleView::OnDraw(CDC* dc) { CMemDC pDC(dc); CExampleDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here - use pDC //as the device context to draw to }
星期四, 11月 10, 2011
星期一, 7月 04, 2011
[VS2010] VC常用快速鍵
Ctrl+] 在括號間移動(游標須在括號旁邊) Ctrl+'-' 移到游標先前所在位置 Ctrl+Shift+'-' 與上面相反 Ctrl+Shift+F 舊式的尋找工具 Ctrl+Tab 循環已開啟視窗 Ctrl+F3 尋找目前所選的文字 Ctrl+L 刪除目前行 Ctrl+W 選取文字(或一段空白) Ctrl+Up 立刻捲動視窗,不需移動游標 Ctrl+Down 立刻捲動視窗,不需移動游標
Ctrl+K,Ctrl+K 設定/取消 書籤 Ctrl+K,Ctrl+P 前往上一個書籤 Ctrl+K,Ctrl+N 前往下一個書籤
Ctrl+K,Ctrl+C 註解選擇文字或當前行 Ctrl+K,Ctrl+U 消去註解
Ctrl+K,Ctrl+F 格式化選取文字 Alt+F8 格式化選取文字
Ctrl+M,Ctrl+M 打開/關閉 程式區塊 Ctrl+M,Ctrl+O 關閉所有程式區塊
F12 移到變數或函式定義處 Shitf+F12 尋找變數的reference
Shift+Alt+Enter 全螢幕 Ctrl+Shift+V 開啟循環剪貼簿
Ctrl+Shift+R 錄製巨集 Ctrl+Shift+P 播放巨集
Alt+Shift+箭頭 以區塊選擇 Ctrl+Enter 上面增加空白行 Ctrl+Sfift+Enter 下面增加空白行
Ctrl+Shift+Comma(,) 字體縮小 (逗號加上Shift即是小於(<)符號) Ctrl+Shift+Period(.) 字體放大 (句號加上Shift即是大於(>)符號)
星期五, 4月 08, 2011
[知識] Non-deterministic Algorithm
Def: 這類演算法在做任何事時,該演算法的下一步可能會有無限多件事可以選擇。 (Permitting more than one choice of next move at some step in a computation) 1.演算法中每一個步驟的運算無法被唯一定義。 2.能夠執行非決定性演算法的機器,稱為非決定性的機器 (Non-deterministic Machine)。 2-1 由於非決定性演算法在執行時,每一步可能有無限多件事要處理,故非決定性計算機器需假設有無限多個處理器可平行處理。因此,非決定性計算機器的計算能力比決定性計算機器要強大。 2-2 但是,實際上並不存在此種機器。 Non-deterministic Algorithm的執行步驟分成兩個階段: 1.猜測階段(Guess) 由於沒有一個既定的程序來從事此階段的猜測工作,因此本階段是Non-deterministic 對於本階段,我們只知道一件事: 1-1 如果一個問題有正確解的話,此階段一定可以將這個正確解給猜出來;反之,若該問題沒有正確解的話,則此階段就會隨便給解答。 1-2 至於猜測階段是怎麼將這個解答給找出來的,我們無從得知(不論所給的解是否為正確解) 。 2.驗証階段(Verification) 將上一階段所猜出來的結果加以驗証是否為真 (True)
星期日, 4月 03, 2011
[旅遊] 319新竹一日蓋章行心得
1. 導航有時還是必要的。雖然地圖上路名大多有標示,不過在寶山的時候,路名跟地圖標示的不一樣,所以多走了一些冤枉路。而且有時候太小的路名也不會標示,遊憩是在山區時候。或是說比例尺太大,地圖沒有標示所有的部分,或是太小而沒有標示小路名,例如在湖口的部分。所以紙本地圖還是有缺點。而且雖然在市區都有標記的很清楚不過,地圖的印刷太雜亂有時候不容易找到路名,像是在新竹市區的時候。
2.在新竹市區看到很多鴿子跟SNG車,回來才發現是因為邱毅所發起的反霸凌示威遊行。
3.在台3線的時候,一路上好多重型機車,其中也有女騎士,不過是少數。在第一間小七,對面是一間萊爾富,停的都是重型機車,這邊小七只有自行車,可能是因為對面停車空間比較大的關係吧。
4.內灣不會很遠,下次可以去看看。
5.原來新湖口指的是湖口車站或是市中心的意思。
6.在新豐鄉蓋章的時候遇到一個怪人,雖然看起來不骯髒,不果衣服都破了,感覺就像是無業遊民。他看到我在蓋章,就過來想要分享心得,雖然我是沒看到他的印章簿,不過感覺他好像真的有在收集的樣子,連台鐵的100章都知道。不知道他怎麼收集的,看起來就不像是有錢的樣子。有些字也不太會寫的感覺,有時候一直重複剛剛講的話。感覺就是一個怪怪的人。
7.除了重機外,一路也發現許多自行車騎士,腿都好壯,我想除非我友好自行車,否則要我這樣騎,我應該騎不遠,雖然我很喜歡騎車到處跑的感覺。可是要我單靠腳力,感覺還是太累了。
8.這次除了319章以外,其他的紀念章蓋的不多,雖然到了竹東的旅遊服務中心,不過那裏一個紀念章也沒有。只有在北埔的文化紀念館蓋了一些以前的古蹟章。因為這個館感覺就很無聊,那裏的工作人員也閒到不知道是在玩遊戲還是只是聽音樂,反正就感覺很爽的樣子,雖然說假日還要上班。
9.湖口往新埔因為沒有直接的道路,可能是因為新埔柿在山中間的平地的關係,所以需要越過山,偏偏道路標示的又不清楚。害我走錯路,雖然是最後還是到了,不過要是沒有手錶上的指南針,我看我八成會走很多冤枉路。不過令人意外的是,雖然新埔的外圍區都是山,大部分都是種茶葉的,不過在市中心感覺還挺熱鬧的,有許多連鎖的商店,那裏的中學生打扮也挺潮流的,有點令人意外。我一開始也很懷疑,這麼山區且有沒有多少觀光資源的地方真的會有小七嗎,沒想到真的有,還有兩間。也幸好有,不然我真的會很失望。不知道為什麼這個地方會有這麼多消費族群可以撐得起這麼多店家。總而言之,新埔跟湖口不應該放在一起蓋,因為這兩個鄉鎮沒有直接連市中心的幹道,應該把新埔鎮放第一位,湖口放最後才對。真是失策,不過因為一開始來不及規畫路線就直接走,所以會發生這樣的情況也是不意外。
蓋章路線
關西 -> 橫山 -> 竹東 -> 北埔 -> 寶山 -> 東區 -> 香山區 -> 北區 -> 竹北 -> 新豐 -> 湖口 -> 新埔
尖石、五峰、峨嵋因為沒有小七而且找店家有點麻煩,所以等下次非假日直接到市公所蓋章好了。
2.在新竹市區看到很多鴿子跟SNG車,回來才發現是因為邱毅所發起的反霸凌示威遊行。
3.在台3線的時候,一路上好多重型機車,其中也有女騎士,不過是少數。在第一間小七,對面是一間萊爾富,停的都是重型機車,這邊小七只有自行車,可能是因為對面停車空間比較大的關係吧。
4.內灣不會很遠,下次可以去看看。
5.原來新湖口指的是湖口車站或是市中心的意思。
6.在新豐鄉蓋章的時候遇到一個怪人,雖然看起來不骯髒,不果衣服都破了,感覺就像是無業遊民。他看到我在蓋章,就過來想要分享心得,雖然我是沒看到他的印章簿,不過感覺他好像真的有在收集的樣子,連台鐵的100章都知道。不知道他怎麼收集的,看起來就不像是有錢的樣子。有些字也不太會寫的感覺,有時候一直重複剛剛講的話。感覺就是一個怪怪的人。
7.除了重機外,一路也發現許多自行車騎士,腿都好壯,我想除非我友好自行車,否則要我這樣騎,我應該騎不遠,雖然我很喜歡騎車到處跑的感覺。可是要我單靠腳力,感覺還是太累了。
8.這次除了319章以外,其他的紀念章蓋的不多,雖然到了竹東的旅遊服務中心,不過那裏一個紀念章也沒有。只有在北埔的文化紀念館蓋了一些以前的古蹟章。因為這個館感覺就很無聊,那裏的工作人員也閒到不知道是在玩遊戲還是只是聽音樂,反正就感覺很爽的樣子,雖然說假日還要上班。
9.湖口往新埔因為沒有直接的道路,可能是因為新埔柿在山中間的平地的關係,所以需要越過山,偏偏道路標示的又不清楚。害我走錯路,雖然是最後還是到了,不過要是沒有手錶上的指南針,我看我八成會走很多冤枉路。不過令人意外的是,雖然新埔的外圍區都是山,大部分都是種茶葉的,不過在市中心感覺還挺熱鬧的,有許多連鎖的商店,那裏的中學生打扮也挺潮流的,有點令人意外。我一開始也很懷疑,這麼山區且有沒有多少觀光資源的地方真的會有小七嗎,沒想到真的有,還有兩間。也幸好有,不然我真的會很失望。不知道為什麼這個地方會有這麼多消費族群可以撐得起這麼多店家。總而言之,新埔跟湖口不應該放在一起蓋,因為這兩個鄉鎮沒有直接連市中心的幹道,應該把新埔鎮放第一位,湖口放最後才對。真是失策,不過因為一開始來不及規畫路線就直接走,所以會發生這樣的情況也是不意外。
蓋章路線
關西 -> 橫山 -> 竹東 -> 北埔 -> 寶山 -> 東區 -> 香山區 -> 北區 -> 竹北 -> 新豐 -> 湖口 -> 新埔
尖石、五峰、峨嵋因為沒有小七而且找店家有點麻煩,所以等下次非假日直接到市公所蓋章好了。
星期四, 3月 24, 2011
[知識] SIFT
SIFT算法的教程、原始碼及應用軟件
1、ubc:DAVID LOWE---SIFT算法的創始人,兩篇經典的文章
http://www.cs.ubc.ca/~lowe/
2、cmu:YanKe---PCASIFT,總結的SIFT方面的文章SO全,超經典
http://www.andrew.cmu.edu/user/yke/
3、ubc:MBROWN---SIFT算法用於圖像拼接的經典應用autopano-sift,包括一個SIFTLIB庫
http://www.cs.ubc.ca/~mbrown/autostitch/autostitch.html
http://www.cs.ubc.ca/~mbrown/panorama/panorama.html
4、toronto:Jepson---Matlab SIFT tutorial, 超級超級超級經典~
http://www.cs.toronto.edu/~jepson
5、ucla:Vedaldi---加州大學一個博士生編的SIFT,Matlab、C的都有,但沒用過
http://www.cs.ucla.edu/~vedaldi/
6、一個小的拼接軟體ptasmblr
http://www.tawbaware.com/ptasmblr.htm
轉自 http://summerstation.spaces.live.com/blog/cns!e39c001cb6e4b188!1501.entry
1、ubc:DAVID LOWE---SIFT算法的創始人,兩篇經典的文章
http://www.cs.ubc.ca/~lowe/
2、cmu:YanKe---PCASIFT,總結的SIFT方面的文章SO全,超經典
http://www.andrew.cmu.edu/user/yke/
3、ubc:MBROWN---SIFT算法用於圖像拼接的經典應用autopano-sift,包括一個SIFTLIB庫
http://www.cs.ubc.ca/~mbrown/autostitch/autostitch.html
http://www.cs.ubc.ca/~mbrown/panorama/panorama.html
4、toronto:Jepson---Matlab SIFT tutorial, 超級超級超級經典~
http://www.cs.toronto.edu/~jepson
5、ucla:Vedaldi---加州大學一個博士生編的SIFT,Matlab、C的都有,但沒用過
http://www.cs.ucla.edu/~vedaldi/
6、一個小的拼接軟體ptasmblr
http://www.tawbaware.com/ptasmblr.htm
轉自 http://summerstation.spaces.live.com/blog/cns!e39c001cb6e4b188!1501.entry
星期二, 12月 14, 2010
[MFC] CImage 直接存取記憶體
//for 8-bit 影像
byte* pRealData=(byte*)m_Image.GetBits(); //取得記憶體開頭
int pit=m_Image.GetPitch(); //每一行的記憶體寬度
for (int y=0; y< Height;y++){
for (int x=0; x< Width;x++){
pRealData[ pit*y + x] = Intensity;
}}
//for 24-bit 影像
byte* pRealData=(byte*)SaveImg.GetBits();
int pit=SaveImg.GetPitch();
int bitCount=3;
for (int y=0; y< height; y++) {
for (int x=0; x< width; x++) {
pRealData [ pit*y + x*bitCount] = R ;
pRealData [ pit*y + x*bitCount+1] = G ;
pRealData [ pit*y + x*bitCount+2] = B;
}}
byte* pRealData=(byte*)m_Image.GetBits(); //取得記憶體開頭
int pit=m_Image.GetPitch(); //每一行的記憶體寬度
for (int y=0; y< Height;y++){
for (int x=0; x< Width;x++){
pRealData[ pit*y + x] = Intensity;
}}
//for 24-bit 影像
byte* pRealData=(byte*)SaveImg.GetBits();
int pit=SaveImg.GetPitch();
int bitCount=3;
for (int y=0; y< height; y++) {
for (int x=0; x< width; x++) {
pRealData [ pit*y + x*bitCount] = R ;
pRealData [ pit*y + x*bitCount+1] = G ;
pRealData [ pit*y + x*bitCount+2] = B;
}}
星期一, 11月 29, 2010
[MFC] Multithread
//Thread function 內容
UINT MyThreadFun(LPVOID LParam)
{
MyThreadInfo *pInfo1=(MyThreadInfo*) LParam;
CTESTDlg *hWnd=(CTESTDlg*)CWnd::FromHandle(pInfo1->Wnd);
CSliderCtrl *slider=(CSliderCtrl*)hWnd->GetDlgItem(IDC_SLIDER1);
slider->SetLineSize(100); // 設定 slider 大小
for(int i=0;i<100;i++){
slider->SetPos(i); // 移動 slider
Sleep(100); // 暫停 thread
}
return(0);
}
//Dialog按鈕程式碼
//開始 Tread
struct MyThreadInfo{
HWND hWnd; // 紀錄產生 thread 的視窗物件
}Info1;
void CTESTDlg::OnBnClickedOk()
{
Info1.hWnd=this->m_hWnd; // 紀錄 Dialog 的window handle
AfxBeginThread(MyThreadFun, (LPVOID)&Info1);
}
UINT MyThreadFun(LPVOID LParam)
{
MyThreadInfo *pInfo1=(MyThreadInfo*) LParam;
CTESTDlg *hWnd=(CTESTDlg*)CWnd::FromHandle(pInfo1->Wnd);
CSliderCtrl *slider=(CSliderCtrl*)hWnd->GetDlgItem(IDC_SLIDER1);
slider->SetLineSize(100); // 設定 slider 大小
for(int i=0;i<100;i++){
slider->SetPos(i); // 移動 slider
Sleep(100); // 暫停 thread
}
return(0);
}
//如果希望 thread function 能放在 class 中, 請宣告它為 static
class CTESTDlg : public CDialog {
static UINT MyThreadFun(LPVOID LParam);
};
///////////////////////////////////////////////////////////////
//Dialog按鈕程式碼
//開始 Tread
struct MyThreadInfo{
HWND hWnd; // 紀錄產生 thread 的視窗物件
}Info1;
void CTESTDlg::OnBnClickedOk()
{
Info1.hWnd=this->m_hWnd; // 紀錄 Dialog 的window handle
AfxBeginThread(MyThreadFun, (LPVOID)&Info1);
}
星期二, 11月 16, 2010
[MFC] Unicode環境下使用CStdioFile來存取中文檔案
因為CStdioFile並不支援Unicode所以無法存取Uncode檔案,而當存取ANSI檔案時又因為Unicode環境下而造成無法使用CStdioFile::ReadString()所讀到的CString。所以加入下面一行程式碼來設定讀入的檔案的地區編碼。
Windows环境下Unicode编程总结和将ANSI转换到Unicode 将Unicode转换到ANSI
setlocale( LC_CTYPE,"cht" );如果是簡體中文則將cht改為chs。
其他參考文章:解决UNICODE字符集下CStdioFile的Writestring无法写入中文的问题
Windows环境下Unicode编程总结和将ANSI转换到Unicode 将Unicode转换到ANSI
[MFC] CImage的簡單複製方法 (Copy CImage)
BOOL ImageCopy(const CImage &srcImage, CImage &destImage)
{
int i,j;//循環變量
if(srcImage.IsNull())
return FALSE;
//原始影像參數
BYTE* srcPtr=(BYTE*)srcImage.GetBits();
int srcBitsCount=srcImage.GetBPP();
int srcWidth=srcImage.GetWidth();
int srcHeight=srcImage.GetHeight();
int srcPitch=srcImage.GetPitch();
//銷毀原有圖像
if( !destImage.IsNull())
{
destImage.Destroy();
}
//創建新圖像
if(srcBitsCount==32) //支援alpha通道
{
destImage.Create(srcWidth,srcHeight,srcBitsCount,1);
}
else
{
destImage.Create(srcWidth,srcHeight,srcBitsCount,0);
}
//加載調色板
if(srcBitsCount<=8&&srcImage.IsIndexed())//需要調色盤
{
RGBQUAD pal[256];
int nColors=srcImage.GetMaxColorTableEntries();
if(nColors>0)
{
srcImage.GetColorTable(0,nColors,pal);
destImage.SetColorTable(0,nColors,pal);//複製調色盤
}
}
//目標影像參數
BYTE *destPtr=(BYTE*)destImage.GetBits();
int destPitch=destImage.GetPitch();
//複製影像數據
for(i=0 ; i<srcHeight;i++)
{
memcpy( destPtr+i*destPitch, srcPtr+i*srcPitch, abs(srcPitch) );
}
return TRUE;
}
星期一, 10月 25, 2010
[攝影] 利用Photoshop做數位黑卡
前置作業:
1. 在Photoshop中同時開啟亮片與暗片。
2. 點選暗片後按Ctrl+A(全選),再按Ctrl+C(拷貝),之後就可以關閉暗片的檔案,你已經用不到暗片了。
3. 點選亮片後按Ctrl+V(貼上),前置作業完成。
繼續:
1. 在LAYER對話框(PALLETE)中先點選第一層也就是暗片的部分,然後點選對話盒最下方,由左邊數來第二個圖示(Add Vector Mask),這時在第一層會出現一個白色的矩形。
2. 在LAYER對話盒點選第二層也就是BACKGROUND的部分,按Ctrl+A(全選),再按Ctrl+C(拷貝)。
3. 按住ALT同時點選在第一步驟時出現的白色長方形,這時畫面會變成白色,再按Ctrl+V(貼上),你會看到黑白影像。
4. 到 Filter / Blur / Gaussian Blur ,把 Radius 設為 40 pixels。
5. 到LAYER對話盒點選BACKGROUND,你就可以看到合成完成的影像。
6. 到 Image/ Adjustment / Shadow/Highlight 將SHADOW值設為24,或其他你認為適當的數值。
7. 回到LAYER對話盒,按上方最右邊的箭頭,將會出現選單,選擇Flaten Image就大功告成了。
引用來源 中文 英文
1. 在Photoshop中同時開啟亮片與暗片。
2. 點選暗片後按Ctrl+A(全選),再按Ctrl+C(拷貝),之後就可以關閉暗片的檔案,你已經用不到暗片了。
3. 點選亮片後按Ctrl+V(貼上),前置作業完成。
繼續:
1. 在LAYER對話框(PALLETE)中先點選第一層也就是暗片的部分,然後點選對話盒最下方,由左邊數來第二個圖示(Add Vector Mask),這時在第一層會出現一個白色的矩形。
2. 在LAYER對話盒點選第二層也就是BACKGROUND的部分,按Ctrl+A(全選),再按Ctrl+C(拷貝)。
3. 按住ALT同時點選在第一步驟時出現的白色長方形,這時畫面會變成白色,再按Ctrl+V(貼上),你會看到黑白影像。
4. 到 Filter / Blur / Gaussian Blur ,把 Radius 設為 40 pixels。
5. 到LAYER對話盒點選BACKGROUND,你就可以看到合成完成的影像。
6. 到 Image/ Adjustment / Shadow/Highlight 將SHADOW值設為24,或其他你認為適當的數值。
7. 回到LAYER對話盒,按上方最右邊的箭頭,將會出現選單,選擇Flaten Image就大功告成了。
引用來源 中文 英文
訂閱:
文章 (Atom)