user-0 提问: 关于c语言图形界面的光条式菜单问题

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:自动关闭也是崩溃的一种。 好了，问题我自己解决了，case WM_COMMAND:{...}后面我忘记加break;了，导致程序执行完按键的命令胡自动执行了后面的case WM_DESTROY:\         PostQuitMessage(0);         return 0;

user: user-1
content: 自动关闭也是崩溃的一种。

user: user-2
content: 用游戏引擎应该比较简单。

user: user-1
content: 或者事先用比如PhotoShop做好要显示的多张位图，编程用GDI显示对应位图即可。

user: user-1
content: 单纯用C，应该也可以，就是略麻烦。 具体请百度搜“用API显示PNG 透明”

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:使用GDIplus 单纯用c，能够做到么？ 课程设计想试着弄进去，如果实在不行的话要怎么样才能制作出图中那种列状菜单呢？

user: user-1
content: 使用GDIplus

user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。 我刚才仔细调试了一下，发现问题没出在菜单那里，而似乎是信息的回调问题，不知道为什么处理完菜单的选项之后程序就直接自动关闭了，实在是没弄明白，帮忙看看好么，谢了！ #include <windows.h> #include <stdlib.h> #include "resource.h" #include "resrc1.h" #include <stdio.h> HDC hDC; HFONT hfont,ohfont; PAINTSTRUCT paint; RECT rect; COLORREF oc; HMENU	hMenuShort;  int PopupShortcutMenu(HWND hWnd) { 	POINT point; 	GetCursorPos(&point); 	 	TrackPopupMenu(GetSubMenu(hMenuShort,0),TPM_CENTERALIGN,point.x,point.y,0,(HWND)hWnd,NULL ); 	return 1; }   LRESULT WINAPI WinProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam) {     	switch(Msg)     { 	case WM_RBUTTONUP: 	    PopupShortcutMenu(hWnd); 		break;     case WM_PAINT:         BeginPaint(hWnd, &paint);         hDC = paint.hdc; // the device context to draw in         GetClientRect(hWnd, &rect); // Obtain the window's client rectangle         hfont = CreateFont(200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");         ohfont=(HFONT)SelectObject(hDC,hfont);         oc=SetTextColor(hDC,0x00C080FF);         SetBkMode(hDC, TRANSPARENT);         TextOut(hDC,rect.left+rect.right/2-600, rect.top+rect.bottom/2-100,"最短画图程序",12);         SelectObject(hDC,ohfont);         SetTextColor(hDC,oc);         DeleteObject(hfont);         EndPaint(hWnd, &paint);         break; 	case WM_COMMAND: 		switch(0x0000ffff&wParam) 		{case 40001: 			MessageBox(NULL,"4001","WinMain",MB_OK); 			break; 		case 40002: 			MessageBox(NULL,"4002","WinMain",MB_OK); 			break; 		case 40003:                         MessageBox(NULL,"4003","WinMain",MB_OK);                         break; 		}     case WM_DESTROY:\         PostQuitMessage(0);         return 0; 	}		     return DefWindowProc(hWnd,Msg,wParam,lParam); }   int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) {     char *cName = "myWindow";     WNDCLASSEX wc;     HWND hWnd;     MSG Msg;     wc.cbClsExtra = 0;     wc.cbWndExtra = 0;     wc.cbSize = sizeof(WNDCLASSEX);     wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);     wc.hCursor = LoadCursor(hInstance,MAKEINTRESOURCE(IDC_1));     wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));     wc.hIconSm = NULL;     wc.hInstance = hInstance;     wc.lpfnWndProc = WinProc;     wc.lpszClassName =(LPSTR)cName;     wc.lpszMenuName = NULL;//     wc.style = CS_HREDRAW | CS_VREDRAW;       RegisterClassEx(&wc);//     hMenuShort = LoadMenu(hInstance,MAKEINTRESOURCE(IDM_SHORTCUT));     hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,cName,"贪吃蛇",WS_POPUP|WS_VISIBLE,         0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),NULL,NULL,hInstance,NULL);     if(hWnd == NULL)     {//容错处理         MessageBox(NULL,"There's an Error","Error Title",MB_ICONEXCLAMATION|MB_OK);         return 0;     }     ShowWindow(hWnd,nShowCmd);//显示窗口     UpdateWindow(hWnd);        while(GetMessage(&Msg,NULL,0,0))     {         TranslateMessage(&Msg);//翻译消息         DispatchMessage(&Msg);//分派消息     }     return Msg.message; }

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:  就是用PhotoShop做好楼主提供的图和这两张图，交替显示。 哦哦，谢谢，不知道最后能不能帮我看看我这程序是什么情况，不知为什么一点弹出菜单的子项目就直接闪退（选项的功能是谁便写的）  #include <windows.h> #include <stdlib.h> #include "resource.h" HDC hDC; HFONT hfont,ohfont; PAINTSTRUCT paint; RECT rect;//RECT用来存储窗口信息的结构，只要是窗口的坐标、宽度和高度。 COLORREF oc; HMENU	hMenuShort;//同上 //定义弹出快捷菜单函数 int PopupShortcutMenu(HWND hWnd) { 	POINT point; 	GetCursorPos(&point);//获取鼠标的位置 	//弹出菜单 	TrackPopupMenu(GetSubMenu(hMenuShort,0),TPM_CENTERALIGN,point.x,point.y,0,(HWND)hWnd,NULL ); 	return 1; }  //回调函数 LRESULT WINAPI WinProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam) {     	switch(Msg)//处理消息过程，什么是消息，下节再讲     {     case WM_LBUTTONUP://鼠标左键松开时 		              //清除文字，出现菜单 		break; 	case WM_RBUTTONUP://鼠标右键松开时 	    PopupShortcutMenu(hWnd); 		break;     case WM_PAINT:         BeginPaint(hWnd, &paint);         hDC = paint.hdc; // the device context to draw in         GetClientRect(hWnd, &rect); // Obtain the window's client rectangle         hfont = CreateFont(200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");         ohfont=(HFONT)SelectObject(hDC,hfont);         oc=SetTextColor(hDC,0x00C080FF);         SetBkMode(hDC, TRANSPARENT);         TextOut(hDC,rect.left+rect.right/2-600, rect.top+rect.bottom/2-100,"最短画图程序",12);         SelectObject(hDC,ohfont);         SetTextColor(hDC,oc);         DeleteObject(hfont);         EndPaint(hWnd, &paint);         break; 	case WM_COMMAND: 		switch(0x0000ffff&wParam) 		{case IDR_HELP: 			//添加新菜单项 			AppendMenu(GetSubMenu(hMenuShort,0),MF_CHECKED,0X4403,"新添加的菜单项"); 			break; 		case IDR_RANK: 			//删除菜单项 			DeleteMenu(GetSubMenu(hMenuShort,0),0x4403,MF_BYCOMMAND); 			break; 		case IDR_EXIT: 			exit(1); 		}     case WM_DESTROY://响应鼠标单击关闭按钮事件         PostQuitMessage(0);//退出消息队列，至于什么是消息队列，下节说         return 0;//退出函数 	}		     return DefWindowProc(hWnd,Msg,wParam,lParam); }  //主函数 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) {     char *cName = "myWindow";     WNDCLASSEX wc;     HWND hWnd;     MSG Msg;     wc.cbClsExtra = 0;     wc.cbWndExtra = 0;     wc.cbSize = sizeof(WNDCLASSEX);     wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//通过函数来设置一个白色的背景     wc.hCursor = LoadCursor(hInstance,MAKEINTRESOURCE(IDC_1));//载入光标资源     wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));     wc.hIconSm = NULL;//不设置     wc.hInstance = hInstance;//当前程序的句柄，hInstance是有系统给传递的     wc.lpfnWndProc = WinProc;//窗口处理过程的回调函数。     wc.lpszClassName =(LPSTR)cName;//窗口类的名字。     wc.lpszMenuName = NULL;//目录名，不设置     wc.style = CS_HREDRAW | CS_VREDRAW;       RegisterClassEx(&wc);//在系统中注册     hMenuShort = LoadMenu(hInstance,MAKEINTRESOURCE(IDM_SHORTCUT));     hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,cName,"贪吃蛇",WS_POPUP|WS_VISIBLE,         0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),NULL,NULL,hInstance,NULL);//创建窗口，窗口标题为"我的窗口我喜欢"     if(hWnd == NULL)     {//容错处理         MessageBox(NULL,"There's an Error","Error Title",MB_ICONEXCLAMATION|MB_OK);         return 0;     }     ShowWindow(hWnd,nShowCmd);//显示窗口     UpdateWindow(hWnd);      //下面是对消息的循环处理，大家先不必管这些，下节课我会细说的 	while(GetMessage(&Msg,NULL,0,0))     {         TranslateMessage(&Msg);//翻译消息         DispatchMessage(&Msg);//分派消息     }     return Msg.message; }

user: user-1
content: 就是用PhotoShop做好楼主提供的图和这两张图，交替显示。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:或者事先用比如PhotoShop做好要显示的多张位图，编程用GDI显示对应位图即可。 这个要怎样做呢？我刚才搜了一会儿看到很多人推荐用GdipDrawImageRect(I)，这个函数是什么情况呀？大神能不能给我弄个实例呀？搜了好一会儿也没找到