| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2897 人关注过本帖
标题:写了个win32基础的窗口 有些问题请教大牛们
只看楼主 加入收藏
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 69楼 有容就大
关于WPARAM和LPARAM两个参数,实际上所有的windows消息都是通过这两个参数进行传递的。当然有时候,其中一个没有用,或是两个都没有用,如发送WM_CLOSE,两个参数都没有用,这两个参数有时候传过来的是一个void指针,所以程序中需要强传成对应消息参数。
另外要注意的是,自定义消息如WM_USER + 1, WM_APP + 100这些消息不能够把指针附给wParam或是lParam,转给消息处理程序,Windows只负责自己的消息进行指针复制,自定义消息不管,想想真是无聊,这么好的功能不提供给用户。

我们都在路上。。。。。
2012-05-10 12:07
有容就大
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
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 72楼 有容就大
哦,搞错了,这个对于自己开的控制台窗口无效,可以使用FindWindows("ConsoleWindowClass", 0)找到控制台窗口句柄,用SetWindowText进行改变,至于为什么是"ConsoleWindowClass",这个是用VC6 common\tools\SPY++.exe找到的类名。

因为我们的工程处在默认Debug下面,这个你可以打开工程的设置,找到如图所示的这个地方可以看到。
图片附件: 游客没有浏览图片的权限,请 登录注册

你也可以查看assert.h这里面,这个宏#ifdef NDEBUG,表示的是如果定义成非DEBUG模式,assert定义就为空。

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

我们都在路上。。。。。
2012-05-10 12:39
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 72楼 有容就大
用这句就行了,SetWindowText(FindWindow("ConsoleWindowClass", 0), "Debug"); //这句也可以放WinMain宏定义那里。
然后把ON_CREATE和ON_DESTROY中的偶加的那两句去了,然后试试Debug编译和Release编译。。得到不同的结果。
最后修改的结果:
GuiDebug.rar (30.06 KB)


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

我们都在路上。。。。。
2012-05-10 12:52
有容就大
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
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 75楼 有容就大
对啊,注意偶用一句就实现了你两句的效果,不用临时变量,这个方法要掌握。
改变控制台,得先有控制台,才会找得到句柄,这段宏在Debug编译下会编译进程序中,在Release编译下,忽略宏里面的内容。
如果对宏定义的作用不太清楚,得补下一下喽,C基础不牢的问题。

我们都在路上。。。。。
2012-05-10 13:00
有容就大
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
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 77楼 有容就大
通过这个例子,让你也掌握了Debug语句的编写,在程序中我们经常要使用的,所以上次你看偶发的那篇关于通用链表中,
使用的assert语句就是需要每个程序员去掌握的,不过估计当时你没有真正的理会这个为什么要这样做。
在程序成为正式发布版的时候,这些Debug语句根本不要去删除,保留在你的程序中,以后修改程序时有用得上的时候。

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

梅尚程荀
马谭杨奚







                                                       
2012-05-10 13:19
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 79楼 有容就大
慢慢来吧,呵呵,这里还有一个例子,偶在写C字符串数据结构时用的,用于跨vc6和CodeBlocks(gcc)两个不同平台的。
写程序不只是要考虑成功实现。。。


**
 *  功能: 字符串格式化
 *  参数: s -- 字符串对象地址,fmt -- 格式化串,...可变参数
 *  返回: int 值,0 表示成功,1 表示失败。
 *  备注: 字符串不能为空
 */
int string_format(String s, const char *fmt, ...)
{
    assert(s);
    if( s && fmt )
    {
        Spri sp = (Spri) s->sprivate;

        if( sp && sp->ch )
        {
            va_list argp;
#ifdef _MSC_VER
            char buffer[BUFSIZ];
#endif

            va_start(argp, fmt);
#ifndef _MSC_VER
            sp->length = vsnprintf(NULL, 0, fmt, argp); /*获取格式化后所需要大小*/
#else
            sp->length = _vsnprintf(buffer, BUFSIZ, fmt, argp);
#endif
            va_end(argp);
            /*重新分配内存*/
            sp->ch = realloc(sp->ch, sp->length + 1);
            if( sp->ch )
            {
                va_start(argp, fmt);
#ifndef _MSC_VER
                vsnprintf(sp->ch, sp->length + 1, fmt, argp); /*格式化输出到字符串中*/
#else
                _vsnprintf(sp->ch, sp->length + 1, fmt, argp);
#endif
                va_end(argp);

                set_error(STR_OK);
                return 0;
            }

            sp->length = 0;
            set_error(STR_MEM_FAILE);
            return 1;
        }
    }
    set_error(STR_IS_NULL);
    return 1;
}

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



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

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