當前位置:首頁 » 編程軟體 » win32實例編程

win32實例編程

發布時間: 2023-05-31 23:05:41

❶ 求救,WIN32編程最簡單問題

他是win的一個圖形映射模式,該模式下允許利用SetWindowExtEx和SetViewportExtEx函數設置圖形映射時的縮放比例。
以下給一個用到isotropic的小程序
他利用滑鼠左右鍵的單擊動作實現方塊的平移和縮放。
其中,平移動作不依賴於mm_isotropic,在任何圖形映射模式下都可實現,縮放必須在mm_isotropic(鎖定長寬比)或者mm_anisotropic(長寬獨立縮放)模式下才能實現

#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //窗口函數說明
//------------ 以下初始化窗口類----------------
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
HWND hwnd ;
MSG Msg ;
WNDCLASS wndclass ;
char lpszClassName[] = "窗口"; //窗口類名
char lpszTitle[]= "My_Windows"; //窗口標題名

//窗口類的定義
wndclass.style = 0; //窗口類型為歷孫預設類型
wndclass.lpfnWndProc = WndProc ; //窗口處理函數為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 = lpszClassName; //窗口類名為"窗口示例"

//--------------- 以下進行窗口類的注冊 -----------------
if( !RegisterClass( &wndclass)) //如果注冊失敗則發出警告聲音
{
MessageBeep(0) ;
return FALSE ;
}

//創建窗口
hwnd=CreateWindow(
lpszClassName, //窗口類名
lpszTitle, //窗口實例的標題名
WS_OVERLAPPEDWINDOW, //窗口的風格
CW_USEDEFAULT,
CW_USEDEFAULT, //窗口左上角坐標為預設值
CW_USEDEFAULT,
CW_USEDEFAULT, //窗口的高和寬為預設值
NULL, //此窗口無父窗口
NULL, //此窗口無主菜單
hInstance, //創建此窗口的應用程序的當前句柄
NULL) ; //不使用該值

ShowWindow( hwnd, nCmdShow); //顯示窗肢清鏈口
UpdateWindow(hwnd); //繪制用戶區
while( GetMessage(&Msg, NULL, 0, 0)) //消息循環
{
TranslateMessage( &Msg) ;
DispatchMessage( &Msg) ;
}
return Msg.wParam; //消息循環結束即程序終止時將信息返回系統
}

int xx=100,yy=0;
/正高/窗口函數
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0); //調用PostQuitMessage發出WM_QUIT消息
break;

case WM_SIZE:
InvalidateRect(hwnd,NULL,1);
break;

case WM_LBUTTONDOWN:
if(xx<150){
xx=200;
}else{
xx=100;
}
InvalidateRect(hwnd,NULL,1);
break;
case WM_RBUTTONDOWN:
if(yy<50){
yy=100;
}else{
yy=0;
}
InvalidateRect(hwnd,NULL,1);
break;
case WM_PAINT:
HDC dc; //開始繪制窗口
HBRUSH brush;
HPEN pen;
PAINTSTRUCT ptstr;
dc=BeginPaint(hwnd,&ptstr);

SetMapMode(dc,MM_ISOTROPIC);
SetWindowExtEx(dc,xx,xx,NULL);
SetViewportExtEx(dc,100,100,NULL);
SetViewportOrgEx(dc,yy,yy,NULL);
SetWindowOrgEx(dc,0,0,NULL);

Rectangle(dc,100,100,200,300);

EndPaint(hwnd,&ptstr);

break;
default: //預設時採用系統消息預設處理函數
return DefWindowProc(hwnd,message,wParam,lParam);
}
return (0);
}
另外,虛機團上產品團購,超級便宜

❷ Win32編程原理

所謂的Win32開發,就是在C語言的層面上,直接使用Win32API開發Windows應用程序或者系統程序。雖說現在直接用Win32API開發應用程序的人已經不多了,但是深入理解Windows系統程序設計原理,仍然是成為Windows開發高手的良好途徑。所謂的Win32,其實是一個API規范,與UNIX系統編程介面標准POSIX是相對應的。下面是進行直接的WIN32SDK方式編程的基本思路或者說是一個框架:
一個Windows程序分為程序代碼和UI(UserInterface用戶介面)資源兩大部份,兩部份最後以RC編譯程序整合為一個完整的EXE文件。所謂UI資源是指功能菜單、對話框、程序圖標、游標形狀等等東西。這些UI資源的實際內容(二進制代碼)系藉助各種工具產生,並以各種擴展名存在,如.ico.bmp.cur等等。程序員必須在一個所謂的資源描述檔(.rc)中描述它們。RC編譯器(RC.EXE)讀取RC文件的描述後將所有UI資源文件集中製作出一個.RES文件,再與程序代碼結合在一起,這才是一個完整的Windows可執行文件。
與控制台程序相同的是,一個Win32程序也必須有一個程序入口點,但是在這兒它不再叫main(),而叫做WinMain(),當WINDOWS的SHELL檢測到用戶欲執行一個EXE程序,就會調用載入器把程序進行載入,然後調用Cstartupcode,後者再調用WinMain(),程序的執行就開始了,WinMain()函數的原型為:
intCALLBACKWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow);
下面程序必須進行必要的初始化工作-產生窗口,第一步是注冊一個窗口類:用API函數:RegisterClass(),而這個函數需要一個已經定義好的系統結構:WNDCLASS,這個結構裡面定義了窗口的種種屬性,需要自己定義,但是許多屬性都有默認值。然後調用CreateWindow()函數來產生具有上述定義屬性的已注冊窗口,但是需要注意的是它只是生成窗口,但並不顯示之,所以還需要調用一個函數ShowWindow()將它顯示在屏幕上,做完這些初始化工作以後,系統將進入消息循環:
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);}
當消息循環捕捉到消息以後將交由窗口函數WndProc()窗口函數進行相應的處理。這樣,一個基於消息事件驅動的WIN32程序的雛形就建立了起來。

❸ 什麼是win32編程

Win32編程,指的是用Window提供的API(Application Programming Interface)為Window編寫應用程序。
之所以稱之為Win32,是因為現在的Window都是32位的(現在已經有64位的吧!但是最普遍是32位).
大家都知道,Window是由GDI.DLL、USER.DLL、KERNEL.DLL三大主要部分組成的。(其實你現在不知道也
不是說的很重要。只是在你學習編程的過程中,你肯定會經常碰到這幾個字眼。你肯定會熟悉它的。),那麼
學習Win32編程的大部分(特別是應用程序界面部分的編程)是用這三個DLL(Dynatic Linked Library)動態鏈接庫
子程序形式提供的API函數。

就我認為:學習Win32編程得有幾個重要條件:一是C語言功底。二是外語功底。三是使用Window的經驗。
要學習它不是很難,但也決非易事:

首先:你必須有編程的經驗。這里的經驗不是指傳統的DOS下的字元模式下的編程。大家都知道,Window是圖形
操作系統、同時也多任務搶占式(理解它很重要),它是在圖形模式下工作。當然你編程得服從於它。但是正
是因為這個,Window的編程模式就和DOS不一樣。所有你得有DOS下編程的經驗,但是還得轉變為WINDOW下的編程
方式。因為兩個系統的編程一個是過程化的。即程序從上到下,順序執行。而另一個是,事件驅動的。要明白
這個,才會體驗到Window的博大精深。
我覺得有必要對Window操作系統有所了解。什麼是多任務,什麼是搶占式。進程和線程的概念。但是剛
開始沒有必要因為這些概念讓我們失去信心。因為只要你入門了,你就會非常興奮。
事件驅動:我們知道DOS下程序是順序執行的。至少它是按著你指定的路徑或條件執行的。盡管可能會
在某些條件下跳轉,但是基本上是在你(程序的掌握之中),但是在事件驅動中,你只需考慮到可能出現的情
況,並對這些情況做相應的處理。當Window執行你的程序時,它會檢測是否發生了你考慮的那些事情是否發生
,如果發生了某件事情(比如你用滑鼠單擊),它會給你的程序發送相應的消息(所以叫做消息驅動,這里
對就滑鼠的消息是WM_MOUSELDOWN等).

❹ 求WINDOWS服務編程實例

我寫的,參考一下:
#include <windows.h>
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>

#define DEFAULT_BEEP_DELAY 3000

char * SERVICE_NAME="BeepService";
HANDLE terminateEvent=NULL;
SERVICE_STATUS_HANDLE serviceStatusHandle;
int beepDelay=DEFAULT_BEEP_DELAY;
BOOL pauseService=FALSE;
BOOL runningService=FALSE;
HANDLE threadHandle=0;

void SendStatusToSCM(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwServiceSpecificExitCode,DWORD dwCheckPoint,DWORD dwWaitHint)
{
SERVICE_STATUS servicestatus;
servicestatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS;
servicestatus.dwCurrentState=dwCurrentState;
if(dwCurrentState==SERVICE_START_PENDING)
{
servicestatus.dwControlsAccepted=0;
}
else
{
servicestatus.dwControlsAccepted=SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE|SERVICE_ACCEPT_SHUTDOWN;
}

if (dwServiceSpecificExitCode==0)
{
servicestatus.dwWin32ExitCode=dwWin32ExitCode;
servicestatus.dwServiceSpecificExitCode=0;

}
else
{
servicestatus.dwWin32ExitCode=ERROR_SERVICE_SPECIFIC_ERROR;
servicestatus.dwServiceSpecificExitCode=dwServiceSpecificExitCode;
}
servicestatus.dwCheckPoint=dwCheckPoint;
servicestatus.dwWaitHint=dwWaitHint;
SetServiceStatus(serviceStatusHandle,&servicestatus);
}

DWORD ServiceThread(LPDWORD parm)
{
while(1)
{
Beep(200,200);
Sleep(beepDelay);
}
return 0;
}

VOID Handler(DWORD controlcode)
{
switch(controlcode)
{
case SERVICE_CONTROL_STOP:
SendStatusToSCM(SERVICE_STOP_PENDING,NO_ERROR,0,1,5000);
runningService=FALSE;
SetEvent(terminateEvent);
return;
case SERVICE_CONTROL_PAUSE:
if(runningService && ! pauseService)
{
SendStatusToSCM(SERVICE_PAUSE_PENDING,NO_ERROR,0,1,1000);
pauseService=TRUE;
SuspendThread(threadHandle);
SendStatusToSCM(SERVICE_PAUSED,NO_ERROR,0,0,0);
}
break;
case SERVICE_CONTROL_CONTINUE:
if(runningService && pauseService)
{
SendStatusToSCM(SERVICE_CONTINUE_PENDING,NO_ERROR,0,1,1000);
pauseService=FALSE;
ResumeThread(threadHandle);
SendStatusToSCM(SERVICE_RUNNING,NO_ERROR,0,0,0);
}
break;
case SERVICE_CONTROL_INTERROGATE:
break;
case SERVICE_CONTROL_SHUTDOWN:
return;
}

}

VOID ServiceMain(DWORD argc,LPTSTR * argv)
{
serviceStatusHandle=RegisterServiceCtrlHandler(SERVICE_NAME,(LPHANDLER_FUNCTION) Handler);
SendStatusToSCM(SERVICE_START_PENDING,NO_ERROR,0,1,5000);
terminateEvent=CreateEvent(0,TRUE,FALSE,0);
SendStatusToSCM(SERVICE_START_PENDING,NO_ERROR,0,2,1000);
if(argc==2)
{
int temp=atoi(argv[1]);
if (temp<1000)
{
beepDelay=DEFAULT_BEEP_DELAY;
}
else
{
beepDelay=temp;
}
}
DWORD id;
threadHandle=CreateThread(0,0,(LPTHREAD_START_ROUTINE)ServiceThread,0,0,&id);
runningService=TRUE;
SendStatusToSCM(SERVICE_RUNNING,NO_ERROR,0,0,0);
WaitForSingleObject(terminateEvent,INFINITE);
CloseHandle(terminateEvent);
SendStatusToSCM(SERVICE_STOPPED,NO_ERROR,0,0,0);
CloseHandle(threadHandle);
}

VOID main(VOID)
{
SERVICE_TABLE_ENTRY serviceTable[]={{SERVICE_NAME,(LPSERVICE_MAIN_FUNCTION)ServiceMain},{NULL,NULL}};
BOOL success;
success=StartServiceCtrlDispatcher(serviceTable);
if(! success) ExitProcess(GetLastError());
}

❺ win32編程實例怎麼理解,等於窗口嗎窗口類又怎麼理解,還有回掉函數…這些代碼的順序是什麼…高手

100分,肥。窗口句柄(HWND)都是由操作系統內核管理的,系統內部有一個z-order序列,記錄著當前從屏幕底部(假象的從屏幕到眼睛的方向),到屏幕最高層的一個窗口句柄的排序,這個排序不關注父窗口還是子窗口。當任意一個窗口接受到WM_PAINT消息睜陪產生重繪,更新區繪制完成以後,就搜索它的前面的一個窗口,如果此窗口的范圍和更新區有交集,就向這個發送wm_paint消息,周而復始,直到執行到頂層窗口。才算完成。對於一個對話框(主窗口來說,其所有子窗口都在茄早洞他的前面——也就是更靠近眼睛的位置),所以主窗口接受wm_paint繪制完成後,會引起更新區上所有子窗口的重繪(所有子窗口也是從底到外排序的)。無所顫枯謂誰管,每個窗口都是對等的,都有自己的消息相應函數,只不過屬性不同。邏輯上可以這么理解,但其實,操作系統是按主窗口排序,然後一個主窗口的所有子窗口是等級的,它們再一個排序。所以邏輯上可以說,系統中所有窗口句柄都有個排序。。望採納,謝謝。

熱點內容
不聯網怎麼看自己的配置 發布:2025-02-13 01:00:38 瀏覽:857
飢荒聯機版獨立伺服器有什麼用 發布:2025-02-13 01:00:38 瀏覽:636
高級語言都有與之對應的編譯程序或解釋程序 發布:2025-02-13 00:54:46 瀏覽:570
塞班java 發布:2025-02-13 00:48:27 瀏覽:157
java策略設計模式 發布:2025-02-13 00:43:35 瀏覽:867
c語言二碼表 發布:2025-02-13 00:37:46 瀏覽:235
免費加密文件 發布:2025-02-13 00:35:00 瀏覽:176
菲亞特菲翔怎麼區別配置 發布:2025-02-13 00:21:19 瀏覽:985
伺服器好壞重點看什麼 發布:2025-02-13 00:19:47 瀏覽:587
php把數據插入資料庫 發布:2025-02-13 00:09:48 瀏覽:369