顯示具有 程式設計 標籤的文章。 顯示所有文章
顯示具有 程式設計 標籤的文章。 顯示所有文章

星期五, 5月 05, 2017

[C#] NLog 使用筆記 - 簡易版


1. 安裝:
    使用 NuGet 安裝 NLog
    主控台中輸入 Install-Package NLog.Config

2. 設定:
    打開 NLog.config 文件,修改 兩個欄位
    決定 log 檔案存放位置, 決定哪一個類別要存放到哪一個 target。
 
    Target 範例:
     <target xsi:type="File" name="f1" fileName="${basedir}/logs/${shortdate}.log"
               layout="${longdate} ${uppercase:${level}} ${message}" />
       說明: Target 名稱為 f1,存檔路徑為執行檔路徑/logs/YY-MM-DD.log
                    儲存內容為 "時間 類型 訊息內容"
 
    Rule 範例
        <logger name="*" minlevel="Info" writeTo="f1" />
     
      說明:Info 類型存放到 Target-f1,Trace 類型存放到 Target-f1

     參考來源:
        http://blog.developer.idv.tw/2012/12/nlog-rules.html
        http://kevintsengtw.blogspot.tw/2011/10/nlog-advanced-net-logging-1.html

3.使用:
    using NLog;
    private static Logger logger = LogManager.GetCurrentClassLogger();
    logger.Info(stringMessage);



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

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

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

星期六, 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.

星期日, 11月 30, 2008

[C++] 數據類型轉換

程式設計一定會碰到的問題之一:類型轉換,但是遇到的時候要怎麼解決,卻只能慢慢試,不是好辦法。這裡有個強者整理出來的方法,可以用來參考。
數據類型轉換整理(全)

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

星期三, 7月 18, 2007

[MFC] Disable 關閉按鈕

有三種方法
1. 重載 CMainFrame::PreTranslateMessage 如下
缺點:按鈕還是顯示Enable
優點:可屏蔽雙擊標題列

if(pMsg->hwnd == this->m_hWnd )
{
if (pMsg->message == WM_SYSCOMMAND)
{
if (pMsg->wParam == SC_MINIMIZE)
return true;
if (pMsg->wParam == SC_CLOSE)
return true;
}
if (pMsg->message == WM_NCLBUTTONDBLCLK)
return true;
if (pMsg->message == WM_NCLBUTTONDOWN)
{
if (pMsg->wParam == HTMINBUTTON)
return true;
if (pMsg->wParam == HTSIZE)
return true;
if (pMsg->wParam == HTCLOSE)
return true;
}
}

2.加在初始化函式
(m_pMainWnd->GetSystemMenu(FALSE))->RemoveMenu(SC_CLOSE,MF_BYCOMMAND);
優點:簡單, 標題列按鈕會顯示Disable
缺點: 只能屏蔽系統選單及標題列
3.::SetClassLong(m_pMainWnd->GetSafeHwnd(),GCL_STYLE,::GetClassLong(m_pMainWnd->GetSafeHwnd(),GCL_STYLE) |CS_NOCLOSE);
優點:簡單, 標題列按鈕會顯示Disable
缺點:系統選單不會消失

星期五, 6月 15, 2007

[MFC] Image/ Color Bottons 連結整理

要讓一個程式好看又好用,有時漂亮的按鈕不可少。以下為從兩個國外有名的VC程式站抓來的相關連結。因為實在懶得再一個一個去找了。
1. Colored buttons
2. Enhanced Colored Button
3. ImageTextButton
4. Colored Buttons
5. Image Button Control
6. Transparant Image Button (BMP, GIF, JPG...)