windows编程
下面是我写的一个程序,本来在窗口中应该显示的是:SM_CXSCREENScreenwidthinpixels640可是显示出来却是乱码。下面是程序的源代码:头文件(sys...
下面是我写的一个程序,本来在窗口中应该显示的是:SM_CXSCREEN Screen width in pixels 640可是显示出来却是乱码。
下面是程序的源代码:
头文件(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")
};
以下是cpp文件:
#include<windows.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);
return 0;
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);
TextOut (
hdc,
22 * cxCaps + 40 * cxChar,
cyChar * i,
szBuffer,
GetSystemMetrics (sysmetrics[i].iIndex)
);
SetTextAlign (hdc, TA_LEFT | TA_TOP);
}
EndPaint (hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam);
} 展开
下面是程序的源代码:
头文件(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")
};
以下是cpp文件:
#include<windows.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);
return 0;
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);
TextOut (
hdc,
22 * cxCaps + 40 * cxChar,
cyChar * i,
szBuffer,
GetSystemMetrics (sysmetrics[i].iIndex)
);
SetTextAlign (hdc, TA_LEFT | TA_TOP);
}
EndPaint (hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam);
} 展开
4个回答
展开全部
看了楼主写的程序,代码写得挺规范,复用性和效率也很好,应该说还是有不错的基础了,特别是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文件
#include<windows.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);
}
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文件
#include<windows.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编程分好几种吗?个人理解是只有一种,window编程是指编写window环境下的软件。但我们可以用不同的开发工具和不同的语言来进行window编程.比如工具有Microsoft
Visual
C++
6.0、Microsoft
Visual
Studio
2005、delphi等工具。语言有c、c++、java
、pascal等。而你所认为的各种编唾分类是针对不同的方面进行的。比如windows核心编程就涉及到硬件方面,根据硬件怎样分配资源,怎样回收等分方面。而网络编程是针对网络方面划分的。涉及到服务器与客户机等。windows图形编程自然与图形编辑有关。windows系统编程针对操作系统的编写。你列出的概念还真是具体啊。我并不是万能,也不能用简短的回答就能解译的清楚的。有些解译深度不够,再所能免。只是为了认你清楚这些是针对不同方面联系较深而作出的概念而已。就象说话,对一个事物,可能有不同的叫法来表现事物与哪方面联系较深。游戏编程与游戏较多。假如有一种在windowsg下的编程与电影联系较深有能力为它命名为windows电影编程。我是说假如。希望不会误导你。
你的第三个问题是选择看书吧。本人认为选择哪本书并不是很重要。关键是你提取知识方面。从具体的编程来是,程序就是指令的集合,而软件开始一个重要的方面就是写指令(写代码)。代码的书写要用编程语言。所以编程就是根据编程语言进行创造的过程。所以真正想做软件开发方面的话,首先要打好基础。首先选择一门比较有感觉的人。比如c,c++,pascal,但不可移植到其它操作系统.java可以跨平台,可以把widow环境下开发的软件直接拿到unix等操作系统使用。不知道你水平如何,但我建议选c++有关的书。其中就有你想要的window编程,使用API函数和各网友所说的用MFC开发。如果想快一点开发你所认为的开发一些有用的实际的东西,那我建议你有delphi7软件开发。不过它是有pascal语言的。所以根据个人情况而定。
文字多了一点。不知道你有没有耐心看,但每个字都是我一手打出来的,可没有用复制的方法哦,可看不起我哦。言尽于此,能看懂多少就看你自己的了。
想找我聊天的话可以直接聊也可以在Q上。
MY
QQ:406784192
windows编程分好几种吗?个人理解是只有一种,window编程是指编写window环境下的软件。但我们可以用不同的开发工具和不同的语言来进行window编程.比如工具有Microsoft
Visual
C++
6.0、Microsoft
Visual
Studio
2005、delphi等工具。语言有c、c++、java
、pascal等。而你所认为的各种编唾分类是针对不同的方面进行的。比如windows核心编程就涉及到硬件方面,根据硬件怎样分配资源,怎样回收等分方面。而网络编程是针对网络方面划分的。涉及到服务器与客户机等。windows图形编程自然与图形编辑有关。windows系统编程针对操作系统的编写。你列出的概念还真是具体啊。我并不是万能,也不能用简短的回答就能解译的清楚的。有些解译深度不够,再所能免。只是为了认你清楚这些是针对不同方面联系较深而作出的概念而已。就象说话,对一个事物,可能有不同的叫法来表现事物与哪方面联系较深。游戏编程与游戏较多。假如有一种在windowsg下的编程与电影联系较深有能力为它命名为windows电影编程。我是说假如。希望不会误导你。
你的第三个问题是选择看书吧。本人认为选择哪本书并不是很重要。关键是你提取知识方面。从具体的编程来是,程序就是指令的集合,而软件开始一个重要的方面就是写指令(写代码)。代码的书写要用编程语言。所以编程就是根据编程语言进行创造的过程。所以真正想做软件开发方面的话,首先要打好基础。首先选择一门比较有感觉的人。比如c,c++,pascal,但不可移植到其它操作系统.java可以跨平台,可以把widow环境下开发的软件直接拿到unix等操作系统使用。不知道你水平如何,但我建议选c++有关的书。其中就有你想要的window编程,使用API函数和各网友所说的用MFC开发。如果想快一点开发你所认为的开发一些有用的实际的东西,那我建议你有delphi7软件开发。不过它是有pascal语言的。所以根据个人情况而定。
文字多了一点。不知道你有没有耐心看,但每个字都是我一手打出来的,可没有用复制的方法哦,可看不起我哦。言尽于此,能看懂多少就看你自己的了。
想找我聊天的话可以直接聊也可以在Q上。
MY
QQ:406784192
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2009-03-25
展开全部
没有注释,谁能看懂啊?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
学习中
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询