星期一, 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);
}


//如果希望 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

目前貼程式碼的方案

SyntaxHighlighter 3.0.83
簡單來說,在程式碼的前後各貼上

<pre class="brush: js">



</pre>

[MFC] Unicode環境下使用CStdioFile來存取中文檔案

因為CStdioFile並不支援Unicode所以無法存取Uncode檔案,而當存取ANSI檔案時又因為Unicode環境下而造成無法使用CStdioFile::ReadString()所讀到的CString。所以加入下面一行程式碼來設定讀入的檔案的地區編碼。

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