【发布时间】:2026-02-23 23:20:10
【问题描述】:
所以我刚刚开始使用 C++ 进行 Windows 编程。首先我画了一些线,没关系,
然后我尝试创建一个用于绘制一些形状的类,当我使用普通方法创建对象时它工作正常(在代码中这些部分被注释掉),
但是当我使用指针创建新对象时,出现Access violation 错误。
这是我的课程(我已经删除了一些代码,因此在某些部分可能看起来过于简单):
class shapes {
public:
shapes(void);
void setstartp( POINT& p0);
void setendp( POINT& p1);
void draw(HDC hdc);
~shapes(void);
POINT x0;
POINT x1;
};
shapes::shapes(){}
void shapes::setstartp( POINT& p0){
x0=p0;
}
void shapes::setendp( POINT& p1){
x1=p1;
}
void shapes::draw(HDC hdc){
MoveToEx(hdc,x0.x ,x0.y ,0);
LineTo(hdc ,x1.x ,x1.y);
}
shapes::~shapes(void) {}
这是我的程序,或者至少是winproc 部分:
//shapes sh;
shapes* sh =0;
bool mousdown =false;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
POINT p0;
POINT p1;
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_LBUTTONDOWN :
SetCapture(hWnd);
mousdown = true;
p0.x = LOWORD(lParam);
p0.y = HIWORD(lParam);
// sh.setstartp(p0);
sh = new shapes();
sh->setstartp(p0);
break;
case WM_MOUSEMOVE :
if(mousdown) {
p1.x = LOWORD(lParam);
p1.y = HIWORD(lParam);
// sh.setendp(p1);
sh->setendp(p1);
InvalidateRect(hWnd ,0,true);
}
break;
case WM_LBUTTONUP :
ReleaseCapture();
mousdown = false;
p1.x = LOWORD(lParam);
p1.y = HIWORD(lParam);
// sh.setendp(p1);
sh->setendp(p1);
InvalidateRect(hWnd ,0,true);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
//sh.draw(hdc);
sh->draw(hdc);
EndPaint(hWnd, &ps);
break;
case WM_COMMAND:
这是我的Access violation 错误:
在 0x00411fda 处未处理的异常 NEWWIN.exe:0xC0000005:访问 违规读取位置0x00000004。
并且错误指向类实现:
void shapes::draw(HDC hdc) {
MoveToEx(hdc,x0.x ,x0.y ,0);
LineTo(hdc ,x1.x ,x1.y);
}
显然我的类属性x0 和x1 有问题:
这个 0x00000000 {x0={...} x1={...} } 形状 * 常量
x0 {x=??? y=???} 标记点
x CXX0030:错误:表达式不能 评价过
y CXX0030:错误:表达式不能 评价过
x1 {x=??? y=???} 标记点
x CXX0030:错误:表达式不能 评价过
y CXX0030:错误:表达式不能 评估
【问题讨论】:
-
用C++做win32开发是自己的选择吗?我首先在 C# 中进行原型设计,然后将结果相关的内容移植回来。
-
是的,我的目标是开始 Directx 编程。