//
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
HWND hIpAddrCtl; hInst = hInstance; // 将实例句柄存储在全局变量中
// hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
// CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
0, 0, 1000, 700, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
} ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
//INITCOMMONCONTROLSEX IpAddrCtl ;
//IpAddrCtl.dwSize = sizeof(IpAddrCtl);
//IpAddrCtl.dwICC = ICC_INTERNET_CLASSES ;
//InitCommonControlsEx (&IpAddrCtl); //hIpAddrCtl = CreateWindow(WC_IPADDRESS,NULL,WS_CHILD ,
// CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);//
CreateWindow("BUTTON", "增加角度", WS_CHILD|WS_VISIBLE,
0, 0, 150, 50, hWnd, (HMENU)IDM_INC, hInstance, NULL);
CreateWindow("BUTTON", "降低角度", WS_CHILD|WS_VISIBLE,
150, 0, 150, 50, hWnd, (HMENU)IDM_DEC, hInstance, NULL); CreateWindow("BUTTON", "增加水平方向图", WS_CHILD|WS_VISIBLE,
300, 0, 150, 50, hWnd, (HMENU)IDM_INC_HRANGE, hInstance, NULL); CreateWindow("BUTTON", "降低水平方向图", WS_CHILD|WS_VISIBLE,
450, 0, 150, 50, hWnd, (HMENU)IDM_DEC_HRANGE, hInstance, NULL); CreateWindow("BUTTON", "增加垂直方向图", WS_CHILD|WS_VISIBLE,
600, 0, 150, 50, hWnd, (HMENU)IDM_INC_VRANGE, hInstance, NULL); CreateWindow("BUTTON", "降低垂直方向图", WS_CHILD|WS_VISIBLE,
750, 0, 150, 50, hWnd, (HMENU)IDM_DEC_VRANGE, hInstance, NULL);
UpdateWindow(hWnd); return TRUE;
}#define MULTIPLE 50
#define PI 3.1415926//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// 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 =0 ,j = 0 ; // 获取一个可供画图的DC,我这里就直接用桌面算了
// HDC hdc = GetWindowDC( GetDesktopWindow() ); HDC hdc = GetWindowDC(hWnd); // 创建红色1像素宽度的实线画笔
//HPEN hpen1 = CreatePen( PS_SOLID, 0, RGB(255,0,0) );
HPEN hpen1 = CreatePen( PS_DASH, 1, RGB(255,0,0) );
// 创建绿色5像素宽度的破折画笔,如果你想创建其他种类的画笔请参阅MSDN
HPEN hpen2 = CreatePen( PS_DASH, 5, RGB(0,255,0) ); HPEN hpen3 = CreatePen(PS_NULL,5, RGB(0,255,0)); // 创建一个实体蓝色画刷
HBRUSH hbrush1 = CreateSolidBrush( RGB(0,0,255) ); // 创造一个透明的画刷,如果你想创建其他种类的画刷请参阅MSDN
HBRUSH hbrush2 = (HBRUSH)GetStockObject( NULL_BRUSH );
// 创建一个填充画刷
HBRUSH hbrush3 = CreateHatchBrush(HS_FDIAGONAL,RGB(0,0,255) ); // 将hpen1和hbrush1选进HDC,并保存HDC原来的画笔和画刷
HPEN hpen_old = (HPEN)SelectObject( hdc, hpen1 );
HBRUSH hbrush_old = (HBRUSH)SelectObject( hdc, hbrush1 ); //SelectObject( hdc, hpen2 );
//SelectObject( hdc, hbrush3 );
int Raster = GetDeviceCaps(hdc,RASTERCAPS ); RECT ClientRect;
char cxChar,cyChar;
HWND hwndButton;
// user string TempStr="";
std::stringstream sstream; // 用之前要包含 头文件
switch (message)
{
case WM_CREATE:
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case IDM_INC:
//MessageBox(hWnd,"aa","",NULL);
g_RsuParam.VerticalAngle++;
ClearWnd(hWnd);
UpdateWindow(hWnd);
//DrawRsu(hWnd,&g_RsuParam);
break;
case IDM_DEC:
g_RsuParam.VerticalAngle--;
ClearWnd(hWnd);
UpdateWindow(hWnd);
//DrawRsu(hWnd,&g_RsuParam);
break;
case IDM_INC_VRANGE:
g_RsuParam.VerticalAngleRange++;
ClearWnd(hWnd);
UpdateWindow(hWnd);
//DrawRsu(hWnd,&g_RsuParam);
break;
case IDM_DEC_VRANGE:
g_RsuParam.VerticalAngleRange--;
ClearWnd(hWnd);
UpdateWindow(hWnd);
//DrawRsu(hWnd,&g_RsuParam);
break;
case IDM_INC_HRANGE:
g_RsuParam.HorizonAngleRange++;
ClearWnd(hWnd);
UpdateWindow(hWnd);
//DrawRsu(hWnd,&g_RsuParam);
break;
case IDM_DEC_HRANGE:
g_RsuParam.HorizonAngleRange--;
ClearWnd(hWnd);
UpdateWindow(hWnd);
//DrawRsu(hWnd,&g_RsuParam);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps); //if (g_RsuParam.NearPoint == 0)
{
DrawRsu(hWnd,&g_RsuParam);
} EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
解决方案 »
- 无法从“const wchar_t [10]”转换为“TCHAR [10]”
- 关于按钮的Icon和BitMap有什么区别啊?
- 应用程序窗口伸缩,对话框也相应的伸缩,怎样实现?
- 如何实现可以输入文字的窗体?
- (求救)怎么存为256色的bmp图片文件(在线等)
- 请教XMLSPY一个问题
- 小问题,如何显示
- 请教各位::怎样设置一个工作者线程的超时时间??
- 请求指导 gdi 渐变效果
- 单文档多视的问题,也是绝好的参考,走过不要错过哦!
- IDispatch error 我想找一份这些错误码的说明,完整一点的
- Microsoft Visual C++ 2010 Express 建了一个"Windows 窗体应用程序“ 发现我不会用了
void ClearWnd(HWND hWnd)
{
RECT rc;
GetClientRect(hWnd,&rc);
InvalidateRect(hWnd,&rc,TRUE);
// HDC hdc=GetDC(hWnd);
// Rectangle(hdc,rc.left,rc.top,rc.right,rc.bottom);
}void DrawRsu(HWND hWnd,struct _RsuType *Rsu)
{
PAINTSTRUCT ps;
//HDC hdc;
int i =0 ,j = 0 ; // 获取一个可供画图的DC,我这里就直接用桌面算了 HDC hdc = GetDC(hWnd); // 创建红色1像素宽度的实线画笔
HPEN hpen1=CreatePen( PS_SOLID, 1, RGB(255,0,0) );
HPEN hpen_old ;
HBRUSH hbrush1 = CreateSolidBrush(RGB(0,0,255));
RECT ClientRect; string TempStr="";
std::stringstream sstream; // 用之前要包含 头文件sstream hpen_old=(HPEN)SelectObject( hdc, hpen1 );
SelectObject( hdc, hbrush1 );
// TODO: 在此添加任意绘图代码... Rsu->NearAngle = Rsu->VerticalAngle-Rsu->VerticalAngleRange/2;
Rsu->FarAngle = Rsu->VerticalAngle+Rsu->VerticalAngleRange/2; Rsu->NearPoint = Rsu->Height*tan(Rsu->NearAngle*PI/180);
Rsu->FarPoint = Rsu->Height*tan(Rsu->FarAngle*PI/180); Rsu->MaxPointX = Rsu->Height*tan(Rsu->VerticalAngle*PI/180);
Rsu->MaxPointY = (sqrt(pow(Rsu->Height,2)+pow(Rsu->MaxPointX,2)))*tan(Rsu->HorizonAngleRange/2*PI/180); Rsu->EllipseA = (Rsu->CenterPointX-Rsu->NearPoint); Rsu->CenterPointX = (Rsu->FarPoint+Rsu->NearPoint)/2;
Rsu->EllipseB = abs(Rsu->MaxPointY/sqrt(1- pow( ((Rsu->CenterPointX-Rsu->MaxPointX)/Rsu->EllipseA),2) ));
Rsu->CenterPointY = Rsu->EllipseB;
// 画杆子
MoveToEx( hdc, 200, 200, NULL );
LineTo( hdc, 200, 200 + Rsu->Height*MULTIPLE);
//sprintf(TempStr,"%f",Rsu->Height); string不能用于sprintf
sstream.str("");
sstream<<"高度: "<<Rsu->Height<<"m";
TempStr=sstream.str();
TextOut(hdc, 200+30, 130,TempStr.c_str(),TempStr.length()); sstream.str("");
sstream<<"水平方向图: "<<Rsu->HorizonAngleRange<<"度";
TempStr=sstream.str();
TextOut(hdc, 200+30, 130+15,TempStr.c_str(),TempStr.length()); sstream.str("");
sstream<<"垂直方向图: "<<Rsu->VerticalAngleRange<<"度";
TempStr=sstream.str();
TextOut(hdc, 200+30, 130+30,TempStr.c_str(),TempStr.length()); sstream.str("");
sstream<<"垂直角度: "<<Rsu->VerticalAngle<<"度";
TempStr=sstream.str();
TextOut(hdc, 200+30, 130+45,TempStr.c_str(),TempStr.length());
// 画天线的左右区域,避免覆盖了近端和远端的连线
DrawRsuHorizonArea(hWnd,Rsu); // 画X轴
MoveToEx( hdc, 0, 200 + Rsu->Height*MULTIPLE, NULL );
LineTo( hdc, 1500, 200 + Rsu->Height*MULTIPLE); //画近端区域
MoveToEx( hdc, 200, 200, NULL );
LineTo( hdc, 200+Rsu->NearPoint*MULTIPLE, 200 + Rsu->Height*MULTIPLE);
//画远端区域
MoveToEx( hdc, 200, 200, NULL );
LineTo( hdc, 200+Rsu->FarPoint*MULTIPLE, 200 + Rsu->Height*MULTIPLE);
//画最强区域
hpen1 = CreatePen( PS_DOT, 1, RGB(255,0,0) );
hpen_old=(HPEN)SelectObject( hdc, hpen1 );
MoveToEx( hdc, 200, 200, NULL );
LineTo( hdc,200+Rsu->MaxPointX*MULTIPLE, 200 + Rsu->Height*MULTIPLE );
SelectObject( hdc, hpen_old );
// 写文字描述
sstream.str("");
sstream<<"近端: "<<Rsu->NearPoint<<"m";
TempStr=sstream.str();
TextOut(hdc, 200+Rsu->NearPoint*MULTIPLE,250 + Rsu->Height*MULTIPLE+30,TempStr.c_str(),TempStr.length()); sstream.str("");
sstream<<"最强: "<<Rsu->MaxPointX<<"m";
TempStr=sstream.str();
TextOut(hdc, 200+Rsu->NearPoint*MULTIPLE, 250 + Rsu->Height*MULTIPLE+50,TempStr.c_str(),TempStr.length()); sstream.str("");
sstream<<"中心: "<<Rsu->CenterPointX<<"m";
TempStr=sstream.str();
TextOut(hdc, 200+Rsu->NearPoint*MULTIPLE, 250 + Rsu->Height*MULTIPLE+70,TempStr.c_str(),TempStr.length()); sstream.str("");
sstream<<"远端: "<<Rsu->FarPoint<<"m";
TempStr=sstream.str();
TextOut(hdc, 200+Rsu->NearPoint*MULTIPLE, 250 + Rsu->Height*MULTIPLE+90,TempStr.c_str(),TempStr.length());}
void DrawRsuHorizonArea(HWND hWnd,_RsuType *Rsu)
{
PAINTSTRUCT ps;
//HDC hdc;
int i =0 ,j = 0 ;
POINT start,end; // 获取一个可供画图的DC,我这里就直接用桌面算了 HDC hdc = GetDC(hWnd); // 创建红色1像素宽度的实线画笔
HPEN hpen1 ;
HPEN hpen_old ;
RECT ClientRect;
HBRUSH hbrush1=CreateSolidBrush(RGB(0,0,255)); string TempStr="";
std::stringstream sstream; // 用之前要包含 头文件sstream hpen1 = CreatePen( PS_SOLID, 0, RGB(0,255,0) );
hpen_old=(HPEN)SelectObject( hdc, hpen1 );
SelectObject(hdc,hbrush1);
// TODO: 在此添加任意绘图代码... start.x=200+Rsu->CenterPointX*MULTIPLE;
start.y=200+Rsu->Height*MULTIPLE-Rsu->CenterPointY*MULTIPLE; end.x=200+Rsu->CenterPointX*MULTIPLE;
end.y=200+Rsu->Height*MULTIPLE+Rsu->CenterPointY*MULTIPLE;// MoveToEx(hdc,start.x,start.y ,NULL);
// LineTo(hdc,end.x,end.y ); Ellipse(hdc,200+Rsu->NearPoint*MULTIPLE,start.y,200+Rsu->FarPoint*MULTIPLE,end.y); sstream.str("");
sstream<<"左侧: "<<Rsu->CenterPointY<<"m";
TempStr=sstream.str();
TextOut(hdc,end.x+80,30+end.y,TempStr.c_str(),TempStr.length()); sstream.str("");
sstream<<"右侧: "<<Rsu->CenterPointY<<"m";
TempStr=sstream.str();
TextOut(hdc,end.x+80,30+end.y+30,TempStr.c_str(),TempStr.length());
}
HXXX不会自动释放的
都是一步步走过来的 你这个代码 一看就是小伙子写的
break;为什么是空的, 把 创建 代码 放这里 !!!
case WM_CREATE要做的事情 我想放到 InitInstance里面做
有什么 充分的理由?
{
int wmId, wmEvent;
PAINTSTRUCT ps;
//HDC hdc;
int i =0 ,j = 0 ;
// 获取一个可供画图的DC,我这里就直接用桌面算了
// HDC hdc = GetWindowDC( GetDesktopWindow() );
HDC hdc = GetWindowDC(hWnd);
// 创建红色1像素宽度的实线画笔
//HPEN hpen1 = CreatePen( PS_SOLID, 0, RGB(255,0,0) );
HPEN hpen1 = CreatePen( PS_DASH, 1, RGB(255,0,0) );
// 创建绿色5像素宽度的破折画笔,如果你想创建其他种类的画笔请参阅MSDN
HPEN hpen2 = CreatePen( PS_DASH, 5, RGB(0,255,0) );
HPEN hpen3 = CreatePen(PS_NULL,5, RGB(0,255,0));
// 创建一个实体蓝色画刷
HBRUSH hbrush1 = CreateSolidBrush( RGB(0,0,255) );
// 创造一个透明的画刷,如果你想创建其他种类的画刷请参阅MSDN
HBRUSH hbrush2 = (HBRUSH)GetStockObject( NULL_BRUSH );
// 创建一个填充画刷
HBRUSH hbrush3 = CreateHatchBrush(HS_FDIAGONAL,RGB(0,0,255) ); 这些代码 放 Create 中, 只需要创建一次 !!!!
数据结构课程设计编程实例——基于Win32 API编程
书中的代码和视频见
http://pan.baidu.com/s/1dD5sSgT
http://pan.baidu.com/s/1c0pLPy4