| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2897 人关注过本帖
标题:写了个win32基础的窗口 有些问题请教大牛们
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
还有个问题 是
如果不通过资源文件的编辑 如
程序代码:
GuiTextMenu MENU
BEGIN
    MenuItem "Run Console" CM_CONSOLE
END

怎么在Register()函数中直接创建菜单 及其ID?
我尝试过这么弄
程序代码:
static char szMenuName[] = "Run Console";
HMENU hMenu;

////////////////////////////////////
// Register the window
////////////////////////////////////

#pragma argsused
BOOL Register(HINSTANCE hInst)
{
    WNDCLASSEX wcx;

    HICON hIcon = (HICON)LoadImage(NULL, "Icon.ico", IMAGE_ICON,
                             0, 0, LR_LOADFROMFILE);
    HCURSOR hCursor = (HCURSOR)LoadImage(NULL, "Hand.cur", IMAGE_CURSOR,
                             0, 0, LR_LOADFROMFILE);
    hMenu = CreateMenu();
    AppendMenu(hMenu, 0, CM_CONSOLE, szMenuName);

    wcx.cbSize = sizeof(wcx);
    wcx.style = CS_HREDRAW | CS_VREDRAW;
    wcx.lpfnWndProc = WndProc;
    wcx.hInstance = hInst;
    wcx.cbClsExtra = 0;
    wcx.cbWndExtra = 0;
    wcx.hCursor = hCursor;
    wcx.hIcon = hIcon;
    wcx.hIconSm = hIcon;
    wcx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wcx.lpszMenuName = szMenuName;// ??? szMenuName 起不到任何作用啊
    wcx.lpszClassName = szAppName;  

    return (RegisterClassEx(&wcx));   // The function here is very important
}




[ 本帖最后由 有容就大 于 2012-5-9 21:24 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-05-09 18:44
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
终于知道怎么动态建立菜单了
程序代码:
BOOL Register(HINSTANCE hInst)
{
    WNDCLASSEX wcx;

    HICON hIcon = (HICON)LoadImage(NULL, "Icon.ico", IMAGE_ICON,
                             0, 0, LR_LOADFROMFILE);
    HCURSOR hCursor = (HCURSOR)LoadImage(NULL, "Hand.cur", IMAGE_CURSOR,
                             0, 0, LR_LOADFROMFILE);
    hMenu = CreateMenu();
    hMenuPop = CreateMenu();
    AppendMenu(hMenuPop, MF_STRING, CM_CONSOLE, szMenuName);
    AppendMenu(hMenu, MF_POPUP, (unsigned int)hMenuPop, "File");

    hMenuPop = CreateMenu();
    AppendMenu(hMenuPop, MF_STRING, IDM_EXIT, "Exit");
    AppendMenu(hMenu, MF_POPUP, (unsigned int)hMenuPop, "Edit");

    wcx.cbSize = sizeof(wcx);
    wcx.style = CS_HREDRAW | CS_VREDRAW;
    wcx.lpfnWndProc = WndProc;
    wcx.hInstance = hInst;
    wcx.cbClsExtra = 0;
    wcx.cbWndExtra = 0;
    wcx.hCursor = hCursor;
    wcx.hIcon = hIcon;
    wcx.hIconSm = hIcon;
    wcx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wcx.lpszMenuName = NULL;
    wcx.lpszClassName = szAppName;  

    return (RegisterClassEx(&wcx));   // The function here is very important
}

BOOL Create(HINSTANCE hInst, int nCmdShow)
{
    hInstance = hInst;   // Connect with the global instance

    HWND hWnd = CreateWindowEx(0, szAppName, szAppName,
                        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0,
                        CW_USEDEFAULT, 0, NULL, hMenu, hInst, NULL);
    if (hWnd == NULL)
    {
        return FALSE;
    }

    ShowWindow(hWnd, nCmdShow);   //...
    UpdateWindow(hWnd);           //...

    return TRUE;
}
要设置菜单的Flags才行 哈哈


梅尚程荀
马谭杨奚







                                                       
2012-05-10 11:14
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 60楼 有容就大
要灵活应用,偶改了一下你的程序。可以在程序开始的时候就创建cmd,结束的时候关闭。
这个地方你还可以用宏#ifdef _DEBUG #endif把两个地方包起来,这样在输出Release工程的时候,不会弹出这个控制台。

添加了一个Printf函数,如果对这个函数的实现原理不太清楚,可以看《C和C指针》中关于可变参数函数一节。
你可以试着改变窗口的大小,cmd窗口中会有值输出的。
GuiDebug.rar (30 KB)

我们都在路上。。。。。
2012-05-10 11:27
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 62楼 有容就大
关于动态菜单创建、删除、插入等相关命令,在Win32汇编第五章第一节中有讲述,也不难。
掌握这个可以在以后的程序中大有作为,以后我们的win32程序结构会和现在的代码有所不同,支持动态事件添加和删除,所以动态控件,动态菜单这些都是有用的。

我们都在路上。。。。。
2012-05-10 11:34
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 63楼 hellovfp
……
程序代码:
void yrjd_OnSize(HWND hwnd, UINT state, int cx, int cy)
{
    InitStdOut();
    Printf("OnSize cx = %d, cy = %d\n", cx, cy);
}

为什么通过这个处理我的控制台上没有任何显示?
图片附件: 游客没有浏览图片的权限,请 登录注册

梅尚程荀
马谭杨奚







                                                       
2012-05-10 11:46
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 59楼 有容就大
Windows画图那个,对于用C程序实现,还是很要写一阵的。实现一些简单的画框,画线,写文字上去就行了。
不过这么多年来这个程序一直就没有变过。
所以后来微软去支持了一个国外的两个学生用C#写的Paint项目,写成了类似于Photoshop的小软件,支持层操作。
呵呵,有兴趣的话,思考一下层操作怎么实现?

我们都在路上。。。。。
2012-05-10 11:48
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 65楼 有容就大
拖动你的主窗口呀,偶这里都有显示的。
图片附件: 游客没有浏览图片的权限,请 登录注册

我们都在路上。。。。。
2012-05-10 11:50
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
………………
哇 原来LOWORD(lParam) & HIWORD(lParam) 是即时读取的数据 改变原WIN32窗口后控制台才能显示出来

梅尚程荀
马谭杨奚







                                                       
2012-05-10 11:50
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
貌似获取鼠标的当前位置的坐标也是通过LOWORD(lParam) & HIWORD(lParam)得到的 那么lParam 究竟是个什么好东西 能存储整个屏幕的坐标数据?
Windows画图工具也有截图功能 不过只限于他界面上有的图片 可以截取其中的一部分

梅尚程荀
马谭杨奚







                                                       
2012-05-10 11:57
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 68楼 有容就大
唉,要分清楚这个控制台和我们主窗口的关系,如果你把这个控制台的标题用SetConsoleTitle("DEBUG");改成这样可能更清楚一些。
整个这个函数的包装可以在WinMain函数中这样写:


int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance,
                   LPSTR lpszCmdParam, int nCmdShow    )
{
    MSG msg;

    if (!hPrevInstance)  // In fact this sentence may be omitted
        if (! Register(hInst))  // Registered Window Class
        {
            return FALSE;
        }
   
    if (!Create(hInst, nCmdShow))   // Create a window instance
    {
        return FALSE;
    }

#ifdef _DEBUG
    AllocConsole();   
#endif

    while (GetMessage(&msg, NULL, 0, 0)) // Message circulation
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

#ifdef _DEBUG
    FreeConsole();
#endif

    return msg.wParam;
}

[ 本帖最后由 hellovfp 于 2012-5-10 13:22 编辑 ]

我们都在路上。。。。。
2012-05-10 12:00
快速回复:写了个win32基础的窗口 有些问题请教大牛们
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020905 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved