Windows简单编程,win10简单编程
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 );
}