1. 程式人生 > >windows程式設計讀書筆記一

windows程式設計讀書筆記一

用VC MFC有一段時間了,總覺得還沒掌握到精髓,專案程式碼基本是拼湊起來的。總是少點什麼。前段時間,看完 快樂鸚鵡 的程式人生, 裡面提到 全域性變數 的一段。突然想到自己用 vc+opencv的一個小專案, 那裡面真可謂 全域性變數滿天飛啊,只要是mat 的變數都成了全域性變數,方便訪問。總覺得自己以前寫程式,純屬為寫而寫, 只要能達到目標,怎麼直接怎麼來,很是野蠻的方式。對寫程式缺乏一個系統的研究,基礎不牢固。很有必要,系統的看看相關書籍了。

1、註冊視窗類時,類的名稱不能重複,當前面已經註冊了一個名字的類(lpszClassName),後面的視窗類就不能再用這個名字了。

以下程式碼用 szAppName[] 及szAppName1[] 放置兩個類名字串,若szAppName1[] 的內容與szAppName[]一樣時,在第二次註冊時不會成功,由GetLastError()的返回值是1410 可以到 〖1410〗-類別已存在。

#include <windows.h>
#include <tchar.h>
#include <mmsystem.h>
#pragma comment(lib, "WINMM.LIB")
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;


int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("HelloWin") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;


     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;




	 static TCHAR szAppName1[] = TEXT("HelloWin");
	 HWND         hwnd1;
	 WNDCLASS     wndclass1;


	 wndclass1.style = CS_HREDRAW | CS_VREDRAW;
	 wndclass1.lpfnWndProc = WndProc;
	 wndclass1.cbClsExtra = 0;
	 wndclass1.cbWndExtra = 0;
	 wndclass1.hInstance = hInstance;
	 wndclass1.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	 wndclass1.hCursor = LoadCursor(NULL, IDC_WAIT);
	 wndclass1.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
	 wndclass1.lpszMenuName = NULL;
	 wndclass1.lpszClassName = szAppName1;


     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }


	 if (!RegisterClass(&wndclass1))
	 {
		 GetLastError();
		 MessageBox(NULL, TEXT("This program requires Windows NT!"),
			 szAppName1, MB_ICONERROR);
		 
		 return 0;
	 }
     
     hwnd = CreateWindow (szAppName,                  // window class name
                          TEXT ("The Hello Program"), // window caption
                          WS_OVERLAPPEDWINDOW,        // window style
                          CW_USEDEFAULT,              // initial x position
                          CW_USEDEFAULT,              // initial y position
                          CW_USEDEFAULT,              // initial x size
                          CW_USEDEFAULT,              // initial y size
                          NULL,                       // parent window handle
                          NULL,                       // window menu handle
                          hInstance,                  // program instance handle
                          NULL) ;                     // creation parameters
     
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;


	 hwnd1 = CreateWindow(szAppName1,                  // window class name
		 TEXT("The Hello Program1"), // window caption
		 WS_OVERLAPPEDWINDOW,        // window style
		 CW_USEDEFAULT,              // initial x position
		 CW_USEDEFAULT,              // initial y position
	 CW_USEDEFAULT,              // initial x size
	 CW_USEDEFAULT,              // initial y size
	 NULL,                       // parent window handle
	 NULL,                       // window menu handle
		 hInstance,                  // program instance handle
		 NULL);                     // creation parameters


	 ShowWindow(hwnd1, iCmdShow);
	 UpdateWindow(hwnd1);
     
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}


LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     HDC         hdc ;
     PAINTSTRUCT ps ;
     RECT        rect ;
     
     switch (message)
     {
     case WM_CREATE:
          PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
          return 0 ;
          
     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;
          
          GetClientRect (hwnd, &rect) ;
		  TextOut(hdc, 0, 0, _T("您好!測試一下數量"), 9);
          DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
                    DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
         
          EndPaint (hwnd, &ps) ;
		  return 0 ;
          
     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
	 case WM_LBUTTONDOWN:
		 PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC);
		 return 0;


     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}


2、上述程式TextOut(hdc,0,0,_T("您好!測試下數量"),9) 針對函式TextOut的試驗。

a、TextOut並不認為字串尾部值為0位元組表示字串的結束,它利用iLength引數來決定字串的長度,把9該大時將會出現亂碼

b、去掉_T() ,也是出現亂碼,  unicode雙位元組字串。

c、確定列印個數時,可以使用 lstrlen() 獲得;

3、訊息中處理的變數,若是有連續性或其他地方需要使用,該變數應宣告為靜態變數。因為訊息結束時,訊息中的變數也會隨之釋放,將上面的回撥函式改為:

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     HDC         hdc ;
     PAINTSTRUCT ps ;
     RECT        rect ;
	 TCHAR szAppName[] = TEXT("大王叫我來尋山!");
	 static int lButtonDownTimes = 0;
	 int rButtonDownTimes = 0;
	 static TCHAR timesDown[100];
	 static TCHAR timesRDown[100];
     
     switch (message)
     {
     case WM_CREATE:
          PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
          return 0 ;
          
     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;
          
          GetClientRect (hwnd, &rect) ;
		  TextOut(hdc, 0, 0, timesDown, 10);
		  TextOut(hdc, 0, 10, timesRDown, 10);
          DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
                    DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
         
          EndPaint (hwnd, &ps) ;
		  return 0 ;
          
     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
	 case WM_LBUTTONDOWN:
		 
		 wsprintf(timesDown, _T("左鍵按下次數:%d"), lButtonDownTimes);
		 InvalidateRect(hwnd,NULL,TRUE);
		 lButtonDownTimes++;
		 return 0;
	 case WM_RBUTTONDOWN:
		 
		 wsprintf(timesRDown, _T("右鍵按下次數:%d"), rButtonDownTimes);
		 InvalidateRect(hwnd, NULL, TRUE);
		 rButtonDownTimes++;
		
		 return 0;

     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}
分別點選滑鼠左鍵和右鍵能清楚的看到 區域性變數 和全域性變數的影響。

上述函式在滑鼠點選的訊息內,呼叫了 InvalidateRect(hwnd,NULL,TRUE)使得整個視窗無效,InvalidateRect函式會生成WM_PAINT訊息。

關於第5章P107對 TextOut的使用

TextOut (hdc, 14*cxCaps+35*cxChar, cyChar*i, szBuffer,
	wsprintf (szBuffer, TEXT ("%5d"),GetDeviceCaps (hdc, devcaps[i].iIndex))) ;
wsprintf 函式的返回值就是字串的長度。

相關推薦

windows程式設計讀書筆記

用VC MFC有一段時間了,總覺得還沒掌握到精髓,專案程式碼基本是拼湊起來的。總是少點什麼。前段時間,看完 快樂鸚鵡 的程式人生, 裡面提到 全域性變數 的一段。突然想到自己用 vc+opencv的一個小專案, 那裡面真可謂 全域性變數滿天飛啊,只要是mat 的變數都成了全

windows程式設計讀書筆記之練習

看完第5章,突然想寫一個類cad的程式,先做簡單功能描述及可能用到的函式 1、畫直線,線寬、線形可以設定,滑鼠左鍵開始繪圖,滑鼠移動時,跟蹤滑鼠繪製直線,再次左鍵,直線繪製完畢,同時開始繪製下一直線,右鍵結束直線繪製。線形線寬在開始繪圖時設定。 2、滑鼠滾動,放大 縮小,

windows程式設計讀書筆記

前面的程式碰到重新整理時碰到閃爍問題,百度一搜,一堆關於雙緩衝解決閃爍的文章。 具體實施方案為: 1、建立一個記憶體DC        hdcMem = CreateCompatibleDC(hdc); 此時,記憶體DC的顯示錶面是單色、1個畫素寬、1個畫素高。即顯示錶面僅

windows程式設計讀書筆記--------資源

 windows使用資源的一個好處是能夠統一的進行管理,把所有的資源都繫結到程式的.EXE檔案中。如果沒有資源的概念的話,資源不得不單獨的作為一個檔案來儲存,並在使用的時候將其讀入記憶體。windows程式設計中,主要有如下一些資源:圖示,滑鼠指標,字串,自定義資源,選單,

windows程式設計讀書筆記

我想我知道為什麼CAD軟體中,當滑鼠移動很快時,影象會跟不上了。 滑鼠移經視窗的客戶區時,Windows系統不會為滑鼠經過的每個象素位置都產生WM_MOUSEMOVE訊息。程式收到的WM_MOUSEMOVE訊息個數取決於滑鼠硬體和視窗過程處理滑鼠移動的速度。換言之,如果訊息

windows程式設計讀書筆記

一、繪圖基礎這一章強調最多的莫過於 資源的取得 及 釋放 1、希望在圖形輸出裝置上繪製圖形,必須首先獲取裝置環境(DC)的控制代碼。在GDI函式中這個控制代碼作為一個引數,告訴windows在哪個裝置上進行繪圖。對裝置的使用完畢時,必須釋放該控制代碼。 a、如果在處理一條訊

實戰java高併發程式設計讀書筆記

基本概念 同步非同步    同步和非同步這兩個是相對的概念用來描述方法的呼叫。同步指的是方法呼叫開始方法的呼叫者必須等待方法呼叫返回時,才能進行下一步操作。而相對的概念非同步就是相反,呼叫者不需要進行等待。 併發並行    併發和並行兩個概念特別的容易混淆,他們都表示兩個以

python高階程式設計讀書筆記

python高階程式設計讀書筆記(一) python 高階程式設計讀書筆記,記錄一下基礎和高階用法 python2和python3相容處理 使用sys模組使程式python2和python3相容 import sysver=sys.version_info#(ma

java程式設計思想讀書筆記(面向物件)

面向物件 我們常見的程式設計正規化有指令式程式設計,函數語言程式設計,邏輯式程式設計,而面向物件程式設計也是一種指令式程式設計。 指令式程式設計式面向計算機硬體的一種抽象,有變數(儲存單元),賦值語句(獲取儲存指令),表示式(記憶體引用和算術運算)和控制語句(跳轉指令),命令式程

Java併發程式設計讀書筆記

  前幾天整理電腦檔案的時候,突然發現了之前還在kindle儲存了關於併發程式設計的書,剛好自己在這方面挺薄弱的,故整理一波讀書筆記,繼續加強學習。   1.上下文切換 1.1 時間片分配演算法 時間片是CPU分配給各個執行緒的時間,CPU通過不停地切換執行緒執行,使各個執行緒彷彿是”同

Javascript高階程式設計--讀書筆記之面向物件(

哈哈哈萬物皆物件,終於到了js的面向物件篇。 一、屬性型別 (1)資料屬性 資料屬性包含一個數據值的位置,在這個位置可以寫入和讀取數值,資料屬性有四個描述器行為的特性 [[Configurable]]:表示能否通過 delete 刪除屬性而重新定義屬性,預設值是ture [[Enumerab

PHP與MySQL程式設計讀書筆記

一、PHP基本型別及函式 1. 短標籤 sprintf??? 2. 型別自動裝換 3. 與型別相關的函式 gettype(),settype(),判斷是否為某個型別:is_name() 變數賦

《MySQL技術內幕——SQL程式設計讀書筆記()——SQL程式設計

一、資料庫的應用型別 對於SQL開發人員,必須先了解進行SQL程式設計的物件型別,即要開發的資料庫應用是哪種型別。 1、OLTP(OnLine Transaction Processing) 聯機

《Hive程式設計指南》讀書筆記 | 文看懂Hive的資料型別和檔案格式

  Hive支援關係型資料庫中的大多數基本資料型別,同時也支援關係型資料庫中很少出現的3種集合資料型別。和大多數資料庫相比,Hive具有一個獨特的功能,那就是其對於資料在檔案中的編碼方式具有非常大的靈活性。大多數資料庫對資料具有完全的控制,其包括對資料儲存到磁碟的過程的控制,也包括對資料生命週期的控制。而Hi

《你必須知道的.NET》讀書筆記:小OO有大智慧

實現 職責 可靠性 基本 code cfile 生存 最好 min() 此篇已收錄至《你必須知道的.Net》讀書筆記目錄貼,點擊訪問該目錄可以獲取更多內容。 一、對象   (1)出生:系統首先會在內存中分配一定的存儲空間,然後初始化其附加成員,調用構造函數執行初始化,這

《JavaScript 高級程序設計》讀書筆記 簡介

ron 設計 str 歷史 定義 程序 筆記一 scrip strong 一 歷史 二 實現   a. javascript三個部分:     ECMAScript:由ECMA-262定義,提供核心語言功能;     DOM:提供HTML的應用程序編程接口/提

《大型網站技術架構》讀書筆記:大型網站架構演化

硬件 解決方案 更新 獨立 流量 操作 大型網站技術架構 負責 思維導圖 一、大型網站系統特點   (1)高並發、大流量:PV量巨大   (2)高可用:7*24小時不間斷服務   (3)海量數據:文件數目分分鐘xxTB   (4)用戶分布廣泛,網絡情況復雜:網絡運營

《算法導論》讀書筆記()

列排序 not else archive stdlib.h 二分查找 printf ima fine   本章是本書的開篇,介紹了什麽是算法,為什麽要學習算法,算法在計算機中的地位及作用。   算法(algorithm)簡單來說就是定義良好的計算機過程,它取一個或一組值

文字上的演算法讀書筆記--基礎知識

1.1 概率論 概率描述一些事情發生的可能性。 大數定理: 當試驗次數(樣本)足夠多的時候,事件出現的頻率無限接近於該事件真實發生的概率。 來表示隨機變數的概率,那麼就要滿足如下兩個特性: 聯合概率 表示兩個事件共同發生的概率,如果相互獨立,則 條件概率 是指在

Lua程式設計學習筆記() Lua基本語法(1)

Lua基本語法(一) 1.  開始 (1)基本常識 lua中的識別符號可以由任意字母、數字、下劃線構成的字串,但不能以數字開頭。 全域性變數不需要申明,直接賦值即可建立,刪除變數直接賦nil。未申明的變數不會報錯,直接返回nil。 行註釋以“–