一道挺悬的GDI问题
// chanchu.cpp : 定义应用程序的入口点。
//
#include "stdafx.h "
#include "chanchu.h "
#include <Windows.h>
#include <Winuser.h>
#include <Wingdi.h>
#define MAX_LOADSTRING 100
// 全局变量:
HINSTANCE hInst;// 当前实例
TCHAR szTitle[MAX_LOADSTRING];// 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];// 主窗口类名
HPEN hpen[7];
HBRUSH hbru[7];
int sPen[7]={PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,PS_NULL,PS_INSIDEFRAME};
int sBru[6]={HS_BDIAGONAL,HS_CROSS,HS_DIAGCROSS,HS_FDIAGONAL,HS_HORIZONTAL,HS_VERTICAL};
// 此代码模块中包含的函数的前向声明:
ATOMMyRegisterClass(HINSTANCE hInstance);
BOOLInitInstance(HINSTANCE, int);
LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);
void MyPoint(HDC hdc);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;
// 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_CHANCHU, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_CHANCHU);
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
// 注释:
//
// 仅当希望在已添加到 Windows 95 的
// “RegisterClassEx”函数之前此代码与 Win32 系统兼容时,
// 才需要此函数及其用法。调用此函数
// 十分重要,这样应用程序就可以获得关联的
// “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style= CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc= (WNDPROC)WndProc;
wcex.cbClsExtra= 0;
wcex.cbWndExtra= 0;
wcex.hInstance= hInstance;
wcex.hIcon= LoadIcon(hInstance, (LPCTSTR)IDI_CHANCHU);
wcex.hCursor= LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName= (LPCTSTR)IDC_CHANCHU;
wcex.lpszClassName= szWindowClass;
wcex.hIconSm= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}
//
// 函数: InitInstance(HANDLE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
HDC hdc;
int i;
hInst = hInstance; // 将实例句柄存储在全局变量中
hWnd = CreateWindow( "canvas ", "绘制窗口 ", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
MoveWindow(hWnd,10,10,650,350,true);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
for( i=0; i <=6; i++)
{
hpen[i]=CreatePen(sPen[i], 1,RGB(255,0,0));
if(6==i)
hbru[i]=CreateSolidBrush(RGB(0,255,0));
else
hbru[i]=CreateHatchBrush(sBru[i],RGB(0,255,0));
}
hdc=GetDC(hWnd);
MyPoint(hdc);
ReleaseDC(hWnd, hdc);
return TRUE;
}
void MyPoint(HDC hdc)
{
int i,x1,x2,y;
for( i=0; i <=6; i++)
{
y=(i+1)*30;
SelectObject(hdc,hpen[i]);
MoveToEx(hdc,30,y,NULL);
LineTo(hdc,100,y);
}
x1=120;
x2=180;
for(int i=0; i <=6; i++)
{
SelectObject(hdc,hbru[i]);
Rectangle(hdc,x1,30,x2,y);
x1+=70;
x2+=70;
}
}
//
// 函数: WndProc(HWND, unsigned, WORD, LONG)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND- 处理应用程序菜单
// WM_PAINT- 绘制主窗口
// WM_DESTROY- 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
int i;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
MyPoint(hdc);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
for( i=0; i <=6; i++)
{
DeleteObject(hpen[i]);
DeleteObject(hbru[i]);
}
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// “关于”框的消息处理程序。
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
程序编译的时候没有错误,但是在运行的时候却没有看到界面。是什么原因。
还有一点是我还没有家入coredll.lib 和 winmgr.lib.怎样把它加进去,我用的是2003的,谢谢大家了。
[解决办法]
加入lib用
#pragma comment(lib, "XXXX.lib ")
代码没问题,初步看效果应该十分不错,实在不行就代码还原。
新建一个,然后逐步添加代码,先声明变量,编译,然后实现MyPoint,编译,然后处理WM_PAINT,编译,然后在InitInstance中初始化画笔和画刷、窗口等。一点点来,看看是哪里导致的效果不对劲了,最后很有可能你会发现代码完全一样,新的就能显示的出来。。
[解决办法]
你在主要地方
比如
类注册的返回值
窗口显示时的句柄地址
看看是否成功创建