跳到主要內容

發表文章

目前顯示的是 6月, 2016的文章

[MFC] 使用Timer更新UI上的資訊

宣告 timer 資源 #define IDC_Timer   2948 宣告訊息映射函數 BEGIN_MESSAGE_MAP( WaitProceDlg , CDialog) ON_WM_TIMER() END_MESSAGE_MAP() 實作回呼函式 onTimer void WaitProceDlg::OnTimer(UINT_PTR nIDEvent) {          // TODO: Add your message handler code here and/or call default                 CDialog::OnTimer(nIDEvent); } 啟動 timer SetTimer(IDC_Timer,500,NULL);

[MFC] 修改字體大小(font size)

假設客戶的需求是希望UI的字體大小能在 runtime 時決定, 此時我們有兩種方式來修改font size: (這裡使用TextControl IDC_STATIC_1) 為例子 Way 1. 取得UI上的控件, 並呼叫SetFont() CFont m_font; / /設定大小為 4 m_ font.CreatePointFont (40 , L"Arial" ); //取得UI上的控件, 並呼叫SetFont() GetDlgItem ( IDC_STATIC_1 )->SetFont(m_font); Way 2. 透過 息映射(message mapping)函數  ON_WM_CTLCOLOR    Step 1.宣告訊息映射(message mapping)函數   BEGIN_MESSAGE_MAP(CTestDlg, CDialog)          ...           ON_WM_CTLCOLOR( )          ...      END_MESSAGE_MAP() Step 2. 實作回呼函式  OnCtlColor HBRUSH CTestDlg :: OnCtlColor ( CDC *  pDC, CWnd *  pWnd, UINT nCtlColor ) {         HBRUSH hbr  =  CDialog :: OnCtlColor (  pDC, pWnd, nCtlColor  ) ;          if ( pWnd - > GetDlgCtrlID ( )   ==   IDC_STATIC_1 )  //取得UI上的控件          {                                 pDC - > SetBkMode ( TRANSPARENT ) ;                 CFont font ;                 font. CreatePointFont ( 40 , L "Arial" ) ;  / /大小為 4                 pDC -

[WPF] UI can't drag or move

由於 Window 設定  WindowStyle ="None" 因此會使UI變成不能拖拉的狀況 解決方法是註冊 MouseDown 的event handle 如下: < Window x : Class ="APPUI.MainWindow"         xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns : x ="http://schemas.microsoft.com/winfx/2006/xaml"              Title ="MainWindow" Height ="540" Width ="764" ResizeMode ="NoResize"         WindowStyle ="None"         MouseDown ="Window_MouseDown_1"         > ... 並且實作  Window_MouseDown_1 private void Window_MouseDown_1( object sender, MouseButtonEventArgs e)         {             if (e.ChangedButton == MouseButton .Left)                 this .DragMove();         }

[C#] 避免系統進入休眠狀態

Prevent system from going to sleep or hibernate 不知道大家有沒有遇過這種問題 由於程式執行的時間可能需要花費大量時間 又執行的環境沒有disable休眠的服務 因此程式執行到一半時系統常常會進入休眠狀態 而造成程式無法作完 為了避免這種狀況發生 可以在程式執行的開頭先暫時關閉系統的休眠功能 直到最後在把休眠功能開啟         [   DllImport (   "kernel32.dll" )]           private   static   extern   uint   SetThreadExecutionState(   uint   esFlags);           private   const   uint   ES_CONTINUOUS = 0x80000000;           private   const   uint   ES_SYSTEM_REQUIRED = 0x00000001;           private   const   uint   ES_DISPLAY_REQUIRED = 0x00000002;         int Main(){                            //Disable S3\S4          SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED );          // Do something                    //Enable S3\S4          SetThreadExecutionState(ES_CONTINUOUS);         }

[WPF] 如何在程式UI秀出來之前先作一些事情

如何在程式UI秀出來之前先作一些事情 首先我們必須知道 App.xaml 可以用來決定程式的起始點(starting point) 如下: <Application   x:Class = "WpfTutorialSamples.App"               xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"               xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"                StartupUri = "MainWindow.xaml" > 預設 StartupUri="MainWindow.xaml" 因此程式一開始會直接秀出 MainWindow 但是有時候我們會想在MainWindow出來前先做一些事情 此時我們就必須選用Startup的屬性來開始程式 並註冊Startup event 的event handle 讓程式起來的時候會先處理我們指定的事情 如下: Step 1. 實作Startup event的event handle   public   partial   class   App   :   Application           {                   private   void   Application_Startup ( object  sender ,   StartupEventArgs  e )                   {                           // Create the startup window                           MainWindow  wnd  =   new   MainWindow ();                              // Show the window                    

[C#] 使用BackgroudWorker 取得執行結果

當我們的程式在處理極為耗時的運算時,為了不要讓UI停在那邊等待運算結果 可以使用thread , BackgroundWorker 來分擔UI thread 的工作量 一般來說首先需要註冊DoWork事件的event handle ...        _BackgroundWorker.DoWork += backgroundWorker_StartToWork; ...         private void backgroundWorker_StartToWork( object sender, DoWorkEventArgs e){             //statement        } 但若想要輸出執行結果的話 可以在DoWork事件的 event handle 裡( backgroundWorker_StartToWork )更新 e.Result的值,並註冊  RunWorkerCompleted  事件的 envent handle, 再藉由它 取得 e.Result          private void backgroundWorker_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e)        {              //statement        }