| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 2897 人关注过本帖
标题:写了个win32基础的窗口 有些问题请教大牛们
取消只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 56楼 hellovfp
大哥 我已经把输出控制台的功能添加到模版中了
帮看下 我做的这个合格了吗
GuiDebug.zip (62.88 KB)


有个问题是 写了OnSize函数
程序代码:
// Specify the size
void yrjd_OnSize(HWND hwnd, UINT state, int cx, int cy)
{
    ;
}
在菜单项里能显示HWND HINSTANCE 和 id 的值
程序代码:
// Handle WM_COMMAND
void yrjd_OnCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify)
{
    char s[100];

    if (id == CM_CONSOLE)
    {
        AllocConsole();
        InitStdOut();
        ClrScr(GOLDBLUE);
        WriteXY(1, 1, "Console status report");
        sprintf(s, "HWND %x HINSTANCE %x ID %d", hWnd, hInstance, id);
        BlankLine(2);
        WriteXY(1, 3, s);
        BlankLine(4);
        WriteXY(1, 5, "Any key to close");
        WaitForKeyPress();
        FreeConsole();
    }
}
那我想通过它显示OnSize的参数如cx   cy  怎么弄?
这个调试Cmd能显示程序中的所有变量的当前值吗?

还有就是发现每个不同的ID值对应一个不同的HWND值 但是都属于同一个实例HINSTANCE

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

梅尚程荀
马谭杨奚







                                                       
2012-05-09 18:30
有容就大
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
有容就大
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
有容就大
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
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 70楼 hellovfp
我这样改
程序代码:
void InitStdOut(void)
{
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTitle("DEBUG"); // 加这里对吗 貌似控制台的标题没变
    hIn = GetStdHandle(STD_INPUT_HANDLE);
}

写成你说的那样 看了下 _DEBUG没有定义 但是程序依然能够运行 为什么?

梅尚程荀
马谭杨奚







                                                       
2012-05-10 12:18
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 73楼 hellovfp
程序代码:
#ifdef _DEBUG
    AllocConsole();
    HWND hwnd = FindWindow("ConsoleWindowClass", 0);
    SetWindowText(hwnd, "DEBUG");
#endif
这样写就能改变 窗口标题了
问题是 必须先分配一个控制台 然后才去改变标题 SetWindowText(hwnd, "DEBUG");里的“*****”对_DEBUG没有影响吧

梅尚程荀
马谭杨奚







                                                       
2012-05-10 12:54
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 76楼 hellovfp
去试了下 有点明白了
_DEBUG 对应的是DEBUG方式
NDEBUG 对应的是RELEASE方式

在RELEASE下 写成
#ifdef NDEBUG
    AllocConsole();
    SetWindowText(FindWindow("ConsoleWindowClass", 0), "Debug666");
#endif
也能打开控制台

图片附件: 游客没有浏览图片的权限,请 登录注册



[ 本帖最后由 有容就大 于 2012-5-10 13:06 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-05-10 13:02
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 78楼 hellovfp
嗯 是啊 好多东西都不晓得啊 要多跟你学 多多的 哈哈

梅尚程荀
马谭杨奚







                                                       
2012-05-10 13:19
快速回复:写了个win32基础的窗口 有些问题请教大牛们
数据加载中...
 
   



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

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018272 second(s), 9 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved