小弟今天在開發時遇到一個問題,狀況描述如下:
主Dialog內有個Static Text,此Static Text用來作為顯示網路串流畫面的物件,
剛開始播放時,畫面顯示皆沒問題,可是只要一遇到播放視窗被其他視窗蓋過後,就會看不到畫面!(如圖)
一開始一直以為是Dialog的redraw有問題,後來網路上找了一下才知道,是Dialog本身的設定要調整。
設定方式:請將dialog的Properties->Styles->Clip children屬性勾選啟動。
因為Dialog是父窗口,當這個屬性未勾選前,父窗口會負責重畫所有物件的畫面,
但是這個屬性勾選後,父窗口不會替子窗口重畫,所以子窗口就能一直顯示串流畫面了!
ref: Vitas的Blog、VC對話框小知識
2012/02/02
2011/10/12
[vc++]LNK2019
環境:windows xp sp3+visual studio 2005
問題:error lnk2019 unresolved external symbol
error LNK2019: unresolved external symbol "extern "C" int __stdcall MyClass::Open(const char *, unsigned int, double )" (?FingerReader@@$$........@Z) referenced in function "private: boo __clrcall ApplicationDlg::OnInitMember(void)" (?Open@MyClass@Open@@$$..$......)
(詳細的錯誤訊息我沒複製下來,只知道大概是這樣。)
好了,問題來了~
它是說我的程式用了一個不認得的外部符號,偏偏我就已經告訴它要用哪個Library了,怎麼還會不認得呢?
井民全是這樣說的....
亞伯特是這樣說的....
還有CSDN上的一堆阿六仔也提供了一些說法與解法,卻沒一個能適用我遇到的狀況......囧rz
當時我只知道狀況是:
我有個Library A ,裡面的class有overload Open 這個 function,然後在dialog做initial時,不認得Open這個符號!
所以我就開個新專案,隨便寫個class,裡面有SetNumber(int total) 這個member function,Link and build過了~
再新增個SetNumber(int x, int y),Link and build又過了!(蝦餃....)
那我去GetNumber()之後,會把Return值用MessageBox秀出,發現是一堆亂碼<--原因是該專案設為使用Unicode字元集!!!
然後進 專案->屬性->組態屬性->一般->專案預設值->字元集->改為"使用多位元組字元集"
顯示的return value就正常囉~
然後我就把原來的專案設定的字元集改成一樣的設定,LNK2019就消失了XDDD
路過的大俠,懂這啥原因的,能給我解釋解釋嗎,多謝!!!
問題:error lnk2019 unresolved external symbol
error LNK2019: unresolved external symbol "extern "C" int __stdcall MyClass::Open(const char *, unsigned int, double )" (?FingerReader@@$$........@Z) referenced in function "private: boo __clrcall ApplicationDlg::OnInitMember(void)" (?Open@MyClass@Open@@$$..$......)
(詳細的錯誤訊息我沒複製下來,只知道大概是這樣。)
好了,問題來了~
它是說我的程式用了一個不認得的外部符號,偏偏我就已經告訴它要用哪個Library了,怎麼還會不認得呢?
井民全是這樣說的....
亞伯特是這樣說的....
還有CSDN上的一堆阿六仔也提供了一些說法與解法,卻沒一個能適用我遇到的狀況......囧rz
當時我只知道狀況是:
我有個Library A ,裡面的class有overload Open 這個 function,然後在dialog做initial時,不認得Open這個符號!
所以我就開個新專案,隨便寫個class,裡面有SetNumber(int total) 這個member function,Link and build過了~
再新增個SetNumber(int x, int y),Link and build又過了!(蝦餃....)
那我去GetNumber()之後,會把Return值用MessageBox秀出,發現是一堆亂碼<--原因是該專案設為使用Unicode字元集!!!
然後進 專案->屬性->組態屬性->一般->專案預設值->字元集->改為"使用多位元組字元集"
顯示的return value就正常囉~
然後我就把原來的專案設定的字元集改成一樣的設定,LNK2019就消失了XDDD
路過的大俠,懂這啥原因的,能給我解釋解釋嗎,多謝!!!
2011/08/16
[vc]Big5、Unicode、UTF-8轉換
最近在寫QRCode,我一直以為QRCode內若要顯示中文,則必須將Big5轉為Unicode後填入即可,結果證明,實際上是填入UTF-8碼才能被讀取。
那麼Unicode跟UTF-8有差嗎?
答案是:兩個本來就不一樣!
每個軟體開發者都絕對一定要會的Unicode及字元集必備知識(沒有藉口!)
一開始我打算將"中文"兩個字弄到QRCode內顯示,
其Big5為:0xA4 0xA4 0xA4 0xE5
其Unicode為:0x4E 0x2D 0x65 0x87
我把 0x4E 0x2D 0x65 0x87塞到QRCode中,想當然爾,怎麼掃都掃不出"中文"兩字,因為它其實是code point~
看過上面那篇文章後,才知道他是指 U+4E2D U+6587
再去查 Unicode Table ,對應到UTF-8的 0xE4 0xB8 0xAD(中) 0xE6 0x96 0x87(文)
再把轉出來的UTF-8 code 塞到QRCode中,才使解碼器正確的解讀出"中文"兩字!
<code>
/***********將BIG5轉換為UTF8***********/
char *szData="中文",*sendbuf_utf8=NULL;
wchar_t *sendbuf_Unicode=NULL;
//big5->unicode
int nDataLen=MultiByteToWideChar (CP_ACP, 0, szData, -1, NULL,0) ;
sendbuf_Unicode=new wchar_t[nDataLen+1];
MultiByteToWideChar(CP_ACP, 0, szData, -1, sendbuf_Unicode, nDataLen);
//unicode->UTF-8
nDataLen=WideCharToMultiByte (CP_UTF8, 0, sendbuf_Unicode, -1, NULL,0 ,NULL, NULL);
sendbuf_utf8=new char[nDataLen+1];
WideCharToMultiByte (CP_UTF8, 0, sendbuf_Unicode, -1, sendbuf_utf8,nDataLen, NULL, NULL);
//到這邊,sendbuf_utf8內的資料即是"中文"兩字的utf-8編碼了~
//delete new buffer
delete []sendbuf_utf8;sendbuf_utf8=NULL;
delete []sendbuf_Unicode;sendbuf_Unicode=NULL;
</code>
那麼Unicode跟UTF-8有差嗎?
答案是:兩個本來就不一樣!
每個軟體開發者都絕對一定要會的Unicode及字元集必備知識(沒有藉口!)
一開始我打算將"中文"兩個字弄到QRCode內顯示,
其Big5為:0xA4 0xA4 0xA4 0xE5
其Unicode為:0x4E 0x2D 0x65 0x87
我把 0x4E 0x2D 0x65 0x87塞到QRCode中,想當然爾,怎麼掃都掃不出"中文"兩字,因為它其實是code point~
看過上面那篇文章後,才知道他是指 U+4E2D U+6587
再去查 Unicode Table ,對應到UTF-8的 0xE4 0xB8 0xAD(中) 0xE6 0x96 0x87(文)
再把轉出來的UTF-8 code 塞到QRCode中,才使解碼器正確的解讀出"中文"兩字!
<code>
/***********將BIG5轉換為UTF8***********/
char *szData="中文",*sendbuf_utf8=NULL;
wchar_t *sendbuf_Unicode=NULL;
//big5->unicode
int nDataLen=MultiByteToWideChar (CP_ACP, 0, szData, -1, NULL,0) ;
sendbuf_Unicode=new wchar_t[nDataLen+1];
MultiByteToWideChar(CP_ACP, 0, szData, -1, sendbuf_Unicode, nDataLen);
//unicode->UTF-8
nDataLen=WideCharToMultiByte (CP_UTF8, 0, sendbuf_Unicode, -1, NULL,0 ,NULL, NULL);
sendbuf_utf8=new char[nDataLen+1];
WideCharToMultiByte (CP_UTF8, 0, sendbuf_Unicode, -1, sendbuf_utf8,nDataLen, NULL, NULL);
//到這邊,sendbuf_utf8內的資料即是"中文"兩字的utf-8編碼了~
//delete new buffer
delete []sendbuf_utf8;sendbuf_utf8=NULL;
delete []sendbuf_Unicode;sendbuf_Unicode=NULL;
</code>
2011/07/12
[vc 2008]字串轉數字atoi()
原本在vc6下面跑的好好得,轉到vs 2008就發生這個問題.......
我先描述一下狀況:
[code]
char szBuffer[16]={0};
sprintf(szBuffer,"%s","3590525100");
int nNumber = atoi(szBuffer);
[/code]
原先我預期要得到3590525100這個數字,但是我卻得到2147483647這個數字,原因是因為atoi()回傳值型態為int,正整數部份最大只能計算到2147483647(即0x7FFFFFFF)。
解決方法:改用 sscanf()
然後我就順利得到3590525100這個數字了^^
ref:
JeffHung.Blog
陳鍾誠的網站
我先描述一下狀況:
[code]
char szBuffer[16]={0};
sprintf(szBuffer,"%s","3590525100");
int nNumber = atoi(szBuffer);
[/code]
原先我預期要得到3590525100這個數字,但是我卻得到2147483647這個數字,原因是因為atoi()回傳值型態為int,正整數部份最大只能計算到2147483647(即0x7FFFFFFF)。
解決方法:改用 sscanf()
[code]
char szBuffer[16]={0};
sprintf(szBuffer,"%s","3590525100");
unsigned int nNumber = 0;
sscanf(Buffer,"%u",&nNumber);
[/code]
然後我就順利得到3590525100這個數字了^^
ref:
JeffHung.Blog
陳鍾誠的網站
訂閱:
文章 (Atom)