| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2682 人关注过本帖
标题:向hellovfp大哥及各位论坛大牛请教关于windows编程记事本的问题
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
收藏
已结贴  问题点数:60 回复次数:78 
向hellovfp大哥及各位论坛大牛请教关于windows编程记事本的问题
最近磕磕绊绊在VS2010下搞了个简单的记事本 参照书上弄的 水平很有限 很多功能都没搞定 想逐个搞清楚原理并陆续加上去
先发下运行文件 (刚传了一次源码 等了半天没提交 结果一脚踢到电源线 关机了 MGD)
NotepadOne.zip (47.42 KB)

先问一个问题
下面是WM_CREATE的代码
程序代码:
case WM_CREATE:
        {
               
                hInst = ((LPCREATESTRUCT)lParam)->hInstance;
                HWND hWndButton = CreateWindow(L"Edit", NULL, WS_CHILD | WS_VISIBLE |
                    ES_WANTRETURN | ES_RIGHT ,
                        220, 60, 50, 18, hWnd, (HMENU)ID_EDIT,  hInst, NULL);               
                // Create the edit control child window
                GetWindowText(hWndButton, szPassword, sizeof(szPassword));
                if (/*lstrcmp(szPassword, L"123") == 0*/1)
                {
                   
                    hWndEdit = CreateWindow(L"Edit", NULL, WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
                                     WS_BORDER | ES_LEFT |ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL
                                     | ES_NOHIDESEL,
                                     0, 0, 0, 0, hWnd, (HMENU)ID_EDIT,
                                     hInst, NULL);
                    SendMessage(hWndEdit, EM_LIMITTEXT, 0, 0L);
                    //MoveWindow(hWndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
                    FileInitialize(hWnd);
                    messageFindReplace = RegisterWindowMessage(FINDMSGSTRING);
                    DoCaption(hWnd, szTitleName);
                }           
            return 0;
        }
我的目的是 先在父窗口里创建一个EDIT控件 用了输入密码的 然后用 GetWindowText(hWndButton, szPassword, sizeof(szPassword));获取输入的字符串 如果这个获取的字符串和要求的密码一样就再创建记事本界面 但是当我在这个编辑框里输入正确的密码后调用GetWindowText后 没有任何反应 难道GetWindowText读取不了这个控件句柄的内容?

查了下 网上说如果用ES_PASSWORD 格式还要复杂些 所以省去了 貌似和WM_GETTEXT有关联 但不知怎么弄.

[ 本帖最后由 有容就大 于 2012-4-25 14:31 编辑 ]
搜索更多相关主题的帖子: 记事本 windows 
2012-04-25 14:27
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:5 
首先你要想下 WM_CREATE响应几次?
你创建了一个Edit 创建完后 难道程序会在后面等待你在Edit中输入内容后再运行吗?
肯定不会吧。

所以你一定要让程序在创建Edit后等待,等待你输入密码等字符再去对记事本进行初始化的操作

怎么做的?传统的做法是弹出对话框提示输入密码(该对话框包含了用户名和密码输入的Edit)
2012-04-25 14:34
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 2楼 hahayezhe
首先 谢谢你的讲解
是的 我是直接在父窗口建立的EDIT控件 WM_CREATE 里面有两个CreateWindow(); 我原以为用个if就能实现先后顺序了 原来程序不会如我所愿啊 你说的意思是要截获字符串吧 要怎么弄呢 再创建个hDlg?

梅尚程荀
马谭杨奚







                                                       
2012-04-25 14:40
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
有么有直接在父窗口写入密码的方法啊?

梅尚程荀
马谭杨奚







                                                       
2012-04-25 14:41
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:0 
在主程序的Create里 添加一个登录对话框(用户名 密码核对)

根据对话框的返回值 判断用户名和密码的正确与否来决定记事本的初始化操作
2012-04-25 14:42
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 5楼 hahayezhe
  这样啊 我去搞下看

梅尚程荀
马谭杨奚







                                                       
2012-04-25 14:50
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:10 
回复 4楼 有容就大
这个程序过程可以有很多种方式。常见的两种方式如下
第一种,用资源编辑器创建一个密码对话框,在进入WinMain程序开始就调用这个对话框。接着判断密码是否正确,然后确定错误的话,直接return返回,不是就进行正常的windows窗口创建及消息循环。
第二种方式:创建主窗口后,在主窗口的WM_CHAR消息中处理用户输入,打印*输出,然后判断正确与否,正确就创建Edit控件。这种方式不用创建密码控件,不过依然可以被人勾住键盘消息从而得知密码,说白了和我们在一般的控制台中打印*号显示密码没有什么区别。

你的edit控件看起来怪怪的,试着把vc6目录common\tools下面的spyxx.exe打开,按CTRL+F,把对话框上面的打靶标志用鼠标拖到windows自带的记事本的Edit控件处,然后查看一下该控件Class Style属性有哪些。这个工具也可以用来查看应用程序接收的各种消息,自己试着玩玩吧,在MSDN的光盘版上面还有该程序的全部源代码。

窗口透明可以使用CreateWindowEx来创建
 hwnd = CreateWindowEx(WS_EX_LAYERED, //透明窗口,需要sp2以上的SDK才能编译

然后在ShowWindow前面加句SetLayeredWindowAttributes就可以了。
//透明度设置, CodeBlocks里的SDK里已经有新的这个API了,可以直接编译,80%的透明窗体
        SetLayeredWindowAttributes(hwnd, 0, 100*255/100, LWA_ALPHA);
        ShowWindow(hwnd, nShow);
        UpdateWindow(hwnd);

思考一下自动换行和支持文件拖放如何实现?

我们都在路上。。。。。
2012-04-26 11:04
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 7楼 hellovfp
刚上来 谢谢大哥指导

我看WINDOWS编程的书 总有一种感觉就是能看的懂但是要自己写就很猥琐 不知道怎么组织语句来实现自己想要的功能 有源代码参照还好 没有源码自己的创造力就很有限 网上有人说windows程序设计要看几遍 我一遍还没看完 惭愧啊

昨天在H版的提示下弄了个简单的登陆对话框
程序代码:
INT_PTR CALLBACK Password(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    TCHAR szPassword[100];
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        {
            GetDlgItemText(hDlg, IDC_PASSWORD, szPassword, sizeof(szPassword));
            // if (LOWORD(lParam) == IDC_OK)
            if (lstrcmp(szPassword, L"123") == 0)
            {
                MessageBox(hDlg, L"Correct!", L"message", MB_OK);
                EndDialog(hDlg, LOWORD(wParam));
                return 1;
                break;
            }
            else    
            {
                //MessageBox(hDlg, L"Wrong!", L"message", MB_OK | MB_ICONERROR);
                return 0;
            }
        }
    }
    return (INT_PTR)FALSE;
}
然后在WM_CREATE里调用
程序代码:
case WM_CREATE:
        {
               TCHAR szBuffer[100];
               hInst = ((LPCREATESTRUCT)lParam)->hInstance;        
            if (DialogBox(hInst, MAKEINTRESOURCE(IDD_PASSWORD), hWnd, Password))   
            {
                    int i = MessageBox(hWnd, L"Do you want to listen a Wonderful Song first.",
                               L"Music", MB_YESNO | MB_ICONQUESTION);
                    if (IDYES == i)       
                        PlaySound(L"Hotel California .wav", NULL, SND_FILENAME | SND_ASYNC);
                    hWndEdit = CreateWindow(L"Edit", NULL, WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
                                     WS_BORDER | ES_LEFT |ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL
                                     | ES_NOHIDESEL,
                                     0, 0, 0, 0, hWnd, (HMENU)ID_EDIT,
                                     hInst, NULL);
                    SendMessage(hWndEdit, EM_LIMITTEXT, 0, 0L);
                    //MoveWindow(hWndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
                    FileInitialize(hWnd);
                    messageFindReplace = RegisterWindowMessage(FINDMSGSTRING);
                    DoCaption(hWnd, szTitleName);
            }
            return 0;
        }
结果在是这个样子:
NotepadOne.zip (33.29 KB)

先蹦出登陆对话框 输入123在没有按确定的情况下直接跳出MessageBox,( 如果把这个注释掉的// if (LOWORD(lParam) == IDC_OK)
恢复 即使输入正确的密码也转不到下面的界面?) 主窗口hWnd不会出现 直接进入hWndEdit界面。

都是在VS2010下搞的 里面的控件和其他工具感觉和VC6不太一样 所以陌生的紧。

再去试试你讲的那些方式 MSDN 光盘版网上搜了下 比较少 找到的几个FTP都打不开? 然后我自己的MSDN里会带源码吗
图片附件: 游客没有浏览图片的权限,请 登录注册


 

[ 本帖最后由 有容就大 于 2012-4-26 14:07 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-04-26 14:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
没搞懂原理就冒进,迟早得花加倍的时间回头补课。

授人以渔,不授人以鱼。
2012-04-26 14:09
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 9楼 TonyDeng
是有点孤军深入的感觉。

梅尚程荀
马谭杨奚







                                                       
2012-04-26 14:11
快速回复:向hellovfp大哥及各位论坛大牛请教关于windows编程记事本的问题
数据加载中...
 
   



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

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