Windows简单编程,win10简单编程

http://www.itjxue.com  2023-01-15 16:52  来源:未知  点击次数: 

windows编程

看了楼主写的程序,代码写得挺规范,复用性和效率也很好,应该说还是有不错的基础了,特别是sysmets.h头文件的写法可以看出要想获取新的系统信息,直接在sysmetrics[]数组中添加新的元素既可。也许是太过粗心吧,问题出在这里:

TextOut (

hdc,

22 * cxCaps + 40 * cxChar,

cyChar * i,

szBuffer, // 楼主是想把获取的系统信息转换为字符串装到里面吧,但是忘了,

//所以该缓存里面根本就是未初始化的乱码,

GetSystemMetrics (sysmetrics[i].iIndex) // 这又是楼主明显笔误哦,szBuffer

//的合法内存大小为10*sizeof(TCHAR),而获取系统的水平分辨率肯定是大于这

//个数字了,那么会导致TextOut函数访问越界,还好是这个函数只是读取了越

//界的部分内容并转换为字符显示,并非改写,不然肯定崩溃。

);

按楼主的意思,这部分代码应该这样写:

wsprintf(szBuffer, TEXT("%d"), GetSystemMetrics (sysmetrics[i].iIndex)); // 获取系统信息并

// 转换为字符串存于缓存szBuffer中

TextOut (

hdc,

22 * cxCaps + 40 * cxChar,

cyChar * i,

szBuffer,

lstrlen(szBuffer) // 获取缓存有效字符串大小

);

另外我添加了获取屏幕高度的代码,作为测试(见sysmets.h头文件)。在我的系统中,程序运行在主窗口中显示的信息是:

SM_CXSCREEN Screen width in pixels 1024

SM_CYSCREEN Screen height in pixels 768

相信这就是你想要的结果。给你完整代码吧:

// sysmets.h 文件

#define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics[0]))

struct

{

int iIndex;

TCHAR *szLabel;

TCHAR *szDesc;

}

sysmetrics [] =

{

{SM_CXSCREEN, TEXT("SM_CXSCREEN"), TEXT("Screen width in pixels")},

{SM_CYSCREEN, TEXT("SM_CYSCREEN"), TEXT("Screen height in pixels")}

};

// CPP文件

#includewindows.h

#include"sysmets.h"

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)

{

static TCHAR szAppName [] = TEXT ("SysMets1");

HWND hwnd;

MSG msg;

WNDCLASS wndclass;

wndclass.cbClsExtra = 0;

wndclass.cbWndExtra = 0;

wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);

wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);

wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wndclass.hInstance = hInstance;

wndclass.lpfnWndProc = WndProc;

wndclass.lpszClassName = szAppName;

wndclass.lpszMenuName = NULL;

wndclass.style = CS_HREDRAW | CS_VREDRAW;

if (!RegisterClass(wndclass))

{

MessageBox (NULL, TEXT ("This program requires Windows NT!"),

szAppName, MB_ICONERROR);

return 0;

}

hwnd = CreateWindow (

szAppName,

TEXT ("Get System Metrics No.1"),

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

NULL,NULL,hInstance, NULL);

ShowWindow (hwnd, iCmdShow);

UpdateWindow (hwnd);

while (GetMessage (msg, NULL, 0, 0))

{

TranslateMessage (msg);

DispatchMessage (msg);

}

return msg.wParam;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

static int cxChar, cxCaps, cyChar;

HDC hdc;

int i;

PAINTSTRUCT ps;

TCHAR szBuffer[10];

TEXTMETRIC tm;

switch (message)

{

case WM_CREATE:

hdc = GetDC (hwnd);

GetTextMetrics (hdc, tm);

cxChar = tm.tmAveCharWidth;

cxCaps = (tm.tmPitchAndFamily 1 ? 3 : 2) * cxChar / 2;

cyChar = tm.tmHeight + tm.tmExternalLeading;

ReleaseDC (hwnd, hdc);

break;

case WM_PAINT:

hdc = BeginPaint (hwnd, ps);

for (i = 0; i NUMLINES; i++)

{

TextOut (

hdc,

0,

cyChar * i,

sysmetrics[i].szLabel,

lstrlen (sysmetrics[i].szLabel)

);

TextOut (

hdc,

22 * cxCaps,

cyChar * i,

sysmetrics[i].szDesc,

lstrlen (sysmetrics[i].szDesc)

);

SetTextAlign (hdc, TA_RIGHT | TA_TOP);

wsprintf(szBuffer, TEXT("%d"), GetSystemMetrics (sysmetrics[i].iIndex));

TextOut (

hdc,

22 * cxCaps + 40 * cxChar,

cyChar * i,

szBuffer,

lstrlen(szBuffer)

);

SetTextAlign (hdc, TA_LEFT | TA_TOP);

}

EndPaint (hwnd, ps);

break;

case WM_DESTROY:

PostQuitMessage (0);

break;

}

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

}

一个简单的windows编程,窗口显示不出来。

switch (message)

{

case WM_DESTROY:PostQuitMessage(0);

}

Default:

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

如何学习Windows编程

windows编程从熟悉win32 API开始,理解windows的运行机制、消息机制等

推荐从win32空窗口开始编程,一个API一个API使用,效果会很好,或者找些书,网上相关pdf很多。

初步学习的话可以从简单界面---控件使用---控件消息---事件处理响应---资源使用等,理解了这些后面学起来就很快了

一个最简单的windows编程

分类: 电脑/网络 程序设计 其他编程语言

问题描述:

下面是一个最简单的windows编程,是从书本上抄写的,直接敲到了电脑上,但是不知道为什么,就是运行不出来,它老是提示那个WndProc函数的

定义有致命的问题,请高手指点一下吧。谢谢。

#include Windows.h

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPreveInstance,

LPSTR szCmdLine,

int iCmdShow){

static TCHAR szAppName[]=TEXT("hellow vc ++6.0");

static TCHAR lpszTitle[]=("my First windows program");

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;

if(!RegisterClass(wndclass))

{

MessageBox(NULL,TEXT("this program requires windows NT"),

szAppName,MB_ICONERROR);

return 0;

hwnd=CreateWindow(szAppName,

TEXT("the hellow program"),

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

NULL,

NULL,

hInstance,

NULL);

ShowWindow(hwnd,iCmdShow);

UpdateWindow(hwnd);

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_PAINT:

hdc=BeginPaint(hwnd,ps);

GetClientRect(hwnd,rect);

DrawText(hdc,

TEXT("hellow vc++6.0"),15,rect,

DT_SINGLELINE|DT_CENTER|DT_VCENTER);

EndPaint(hwnd,ps);

return 0;

case WM_DESTROY:

PostQuitMessage(0);

return 0;}

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

}

解析:

不少地方的大括号你打错位置了,下面的可以了,你自己对比一下吧。

#include Windows.h

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );

int WINAPI WinMain( HINSTANCE hInstance,

HINSTANCE hPreveInstance,

LPSTR szCmdLine,

int iCmdShow )

{

static TCHAR szAppName[] = TEXT( "hellow vc ++6.0" );

static TCHAR lpszTitle[] = ( "my First windows program" );

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;

if ( !RegisterClass( wndclass ) )

{

MessageBox( NULL,

TEXT( "this program requires windows NT" ),

szAppName,

MB_ICONERROR );

return 0;

}

hwnd = CreateWindow( szAppName,

TEXT( "the hellow program" ),

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

NULL,

NULL,

hInstance,

NULL );

ShowWindow( hwnd, iCmdShow );

UpdateWindow( hwnd );

while ( GetMessage( msg, NULL, 0, 0 ) )

{

TranslateMessage( msg );

DispatchMessage( msg );

}

return msg.wParam;

return 0;

}

LRESULT CALLBACK WndProc( HWND hwnd,

UINT message,

WPARAM wParam,

LPARAM lParam )

{

HDC hdc;

PAINTSTRUCT ps;

RECT rect;

switch ( message )

{

case WM_PAINT:

hdc = BeginPaint( hwnd, ps );

GetClientRect( hwnd, rect );

DrawText( hdc,

TEXT( "hellow vc++6.0" ),

15,

rect,

DT_SINGLELINE | DT_CENTER | DT_VCENTER );

EndPaint( hwnd, ps );

return 0;

case WM_DESTROY:

PostQuitMessage( 0 );

return 0;

}

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

}

(责任编辑:IT教学网)

更多

推荐其他源码文章