自制WINDOWS窗口框架(修改完善后實現了輸入和顯示功能),C+WIN-API,再也不用面對黑框框學C語言了



/*使用DEVC++5.0編譯通過,新手朋友請注意,啟動順序為打開DEVC++ - 新建項目 - 新建windows application程序(這里不是控制台程序),
然后新建HELLOWORD項目,清空MAIN.C代碼,將本代碼復制進去編譯運行即可,
具體功能通過修改C代碼實現,大家自己去探索。代碼保存為.C文件,直接打開無法通過*/
截圖:


代碼如下:




#include <windows.h> //#include <stdlib.h> #define IDC_EDIT1 201 //自定義控件識別號 #define IDC_EDIT2 202 #define IDC_STATIC 301 #define IDC_BTN1 101 //回調函數............................................................................. LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static TCHAR sss[256]; //不同的case分支之間傳值一定要定義全局變量,否則會出錯 static TCHAR sss1[256]; static int len,size,i,j,x=10,y=200; static double sun; TCHAR szText[256]; HWND edit1,edit2; HWND an1; HWND sta1; switch(uMsg) //消息分支選擇,注意SWITCH-CASE結構中,BREAK代表跳出當前SWITCH,RETURN代表結束整個函數。 { case WM_COMMAND: { switch(LOWORD(wParam)) //點擊不同的控件顯示,走不同的處理路徑 { case IDC_BTN1: //點擊按鈕1觸發消息 { //MessageBox(hwnd,"提交成功","提示",MB_OK|MB_ICONINFORMATION); len=GetDlgItemText(hwnd,IDC_EDIT1,sss,255); //獲取控件內容函數 ,返回值為控件文本字節長度 //MessageBox(hwnd,sss,"輸入內容",MB_OK); GetDlgItemText(hwnd,IDC_EDIT2,sss1,255); sun=atof(sss)+atof(sss1); /*處理數據輸入和涉及到數字運算用這個函數轉換數據類型:【atof()】是把字符串轉換成整型數的一個函數,掃描參數nptr字符串,跳過前面的空格字符,直到遇上數字或正負符號才開始做轉換,而再遇到非數字或字符串結束時('\0')才結束轉換,並將結果返回.默認返回類型為double類型,包含在頭文件stdlib.h中。反方向函數為itoa()將整數轉換成字符串*/ InvalidateRect(hwnd,NULL,TRUE); //發送刷新指令 ,這個很關鍵。要不然窗口不會及時顯示結果。。 } break; default: break; } break; } break; case WM_DESTROY: //當前窗口被銷毀時 PostQuitMessage(0); //發出退出程序的消息 break; case WM_CLOSE: //右上角關閉按鈕消息 DestroyWindow(hwnd); //銷毀窗口 break; case WM_CREATE: //控件創建消息 { edit1 = CreateWindow("EDIT",NULL, WS_CHILD|WS_VISIBLE|WS_BORDER, 220, 30, 100,25,hwnd,(HMENU)IDC_EDIT1, NULL, NULL); //創建編輯框控件 edit2 = CreateWindow("EDIT",NULL, WS_CHILD|WS_VISIBLE|WS_BORDER, 220, 60, 100,25,hwnd,(HMENU)IDC_EDIT2, NULL, NULL); //創建編輯框控件 an1 = CreateWindow("button","計算",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,340,60,50,25,hwnd,(HMENU)IDC_BTN1,NULL,NULL); //創建按鈕控件 //sta1= CreateWindow("STATIC","+",WS_CHILD|WS_VISIBLE|SS_CENTER,70,10,300,200,hwnd,(HMENU)IDC_STATIC,NULL,NULL); //創建靜態文本框控件,畫布,美化作用,下一步再深入研究 } break; case WM_PAINT: //【重繪窗口函消息 】 { HDC hdc; //定義輸出設備句柄 //RECT rect; //定義一塊顯示區域,DrawText 函數需要的參數 PAINTSTRUCT ps = {0}; //定義一個 數組存放字符串 hdc = BeginPaint(hwnd,&ps); //開始重繪 /******************************************核心程序代碼區******************************************************************/ SetTextColor(hdc, RGB(255,0,0)); //設置字體顏色 Rectangle(hdc,2,2,818,555); Rectangle(hdc,10,190,810,550); //畫矩形,必須在正文之前顯示框,否則正文會被覆蓋 TextOut(hdc,350,200,TEXT("九九乘法表"),10); //直接文本顯示 for(i=1;i<=9;i++) for(j=1;j<=i;j++) { size = wsprintf(szText,TEXT("%d×%d=%2d"),j,i,i*j); //將變量S,I的值按照格式符號%s%d轉換后存入緩沖區szText,返回值為字節長度 /*注意:因為 wsprintf不支持浮點數,所以處理高精度數據計算式要用 swprintf代替*/ TextOut(hdc,x+j*80,y+i*25, szText,size); } TextOut(hdc,650,530,TEXT("小狗WINDOWS小程序"),17); Rectangle(hdc,10,10,810,180); //矩形(美化類函數,形成邊框效果) TextOut(hdc,450,30,TEXT("簡單的WIN32窗口框架,能夠實現輸入和顯示"),39); TextOut(hdc,100,30,TEXT("請輸入參數A的值:"),16); TextOut(hdc,100,60,TEXT("請輸入參數B的值:"),16); TextOut(hdc,100,90,TEXT("A+B= :"),len); /*顯示數字用以下代碼*/ size = sprintf(szText,TEXT("%.4lf"),sun); TextOut(hdc,220,90,szText,size); /*顯示文字或字母用以下代碼 TextOut(hdc,550,30,sss,len);*/ /******************************************核心程序代碼區******************************************************************/ EndPaint(hwnd,&ps); //結束重繪 } break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; } /*********************************************以下為主窗口函數**********************************************************************/ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){ WNDCLASSEX wzgwind = {0}; //窗口類結構, 為注冊窗口類作准備 wzgwind.cbSize = sizeof(wzgwind); //WNDCLASSEX結構的大小 wzgwind.cbWndExtra = 0; //窗口額外內存, 沒有, 設為0 wzgwind.hbrBackground = COLOR_WINDOW; //使用系統默認背景 //wzgwind.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); //窗口背景, 這里使用灰色背景(另一種表示法) wzgwind.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); //應用程序使用的鼠標類型 wzgwind.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)); //光標類型 wzgwind.hIconSm = NULL; //應用程序程序的小光標, 不管, 設為 NULL wzgwind.hInstance = hInstance; //應用程序程序實例句柄, 由 WinMain 函數傳遞過來 wzgwind.lpfnWndProc = WndProc; //這個很重要, 就是當前窗口的消息處理函數, 傳遞 WndProc 的地址 wzgwind.lpszClassName = "wzgwind"; //創建類時使用的類名, 可以自定義 wzgwind.lpszMenuName = NULL; //菜單, 沒有, 就使用 NULL wzgwind.style = CS_HREDRAW | CS_VREDRAW; //類的風格, 垂直重繪, 水平重繪 ATOM nAtom = RegisterClassEx(&wzgwind); if (!nAtom ) { MessageBox(NULL, "注冊失敗", "Infor", MB_OK); return 0; } HWND hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"wzgwind","win-gou",WS_VISIBLE|WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, /* x */ CW_USEDEFAULT, /* y */ 840, /* width */ 600, /* height */ NULL,NULL,hInstance,NULL); ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); MSG msg = { 0 }; //定義並初始化msg while( msg.message != WM_QUIT ) //使用while循環,如果消息不是WM_QUIT消息,就繼續循環 { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //查看應用程序消息隊列,有消息時將隊列中的消息派發出去。 { TranslateMessage( &msg ); //將虛擬鍵消息轉換為字符消息 DispatchMessage( &msg ); //分發一個消息給窗口程序。 } } UnregisterClass("wzgwind", wzgwind.hInstance); return 0; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM