回 帖 发 新 帖 刷新版面

主题:用CreateWindow()建立文本框后遇到的种种问题

新建了一个windows应用程序,在用CreateWindow()建立了SDI窗口之后,紧接着使用CreateWindow()在窗口客户区建立了一个文本框(类名写成“EDIT”就能创建),然后就遇到了各种问题,真是让人愁肠百结,郁闷无比,因为根本就找不到这方面的书籍,只能借鉴VC或VB中API函数的使用方法来摸索。已经解决了一些,剩下的就只能靠大神帮忙了。如果哪位能知道一星半点也请不吝赐教,小弟会慢慢去查的,在此先说声谢谢了。
1.文本框中文本的输入输出问题。 我现在用的是
[center]ret=sendmessage(ghedit,WM_SETTEXT,0,loc(gtext)) [/center]
可是这样必须不停的提取、合并字符串,因为只能输出一个字符串,谁有什么好办法能输出的方便一些呢?
2.还有当在CreateWindow()中添加窗口风格ES_READONLY,即使文本框变成只读形式时,背景变灰了,怎么样能让它变白呢?
3.窗口类名是“EDIT”这是系统默认的,怎么样能把这个默认的窗口类调出来呢?
4.因为一次只能输出一个字符串,如果太长的话会超出屏幕,但不是把滚动条自动滚到最后一行,即便把窗口风格设置成自动的也不行,因为是一整个字符串…  网上看到VC中有这个属性SelectionStart,把它设置成最大值就可以将光标移到最后一位,我猜这样应该可以自动滚到最后一行,但SelectionStart是谁的属性啊,我连窗口类都不知道…
以下是创建文本框的函数:
ghedit = createwindowEx(0,"edit","",                                          &
IOR(WS_child,IOR(WS_visible,IOR(WS_VSCROLL,IOR(WS_HSCROLL,IOR(WS_BORDER,     &
IOR(ES_AUTOHSCROLL,IOR(ES_LEFT,IOR(ES_WANTRETURN,ES_MULTILINE)))))))),       &
0,0,width-8,height-54,ghwndMain,NULL,hInstance,NULL)
最后再次说声谢谢,唉,用fortran编界面的太少,如果遇到就赶紧嫁了吧

回复列表 (共6个回复)

沙发

问题是为何不让擅长做界面的做界面呢?用Fortran做界面简直就是用API来堆,还不如直接用VC或C++Builder呢。。。

板凳

[quote]问题是为何不让擅长做界面的做界面呢?用Fortran做界面简直就是用API来堆,还不如直接用VC或C++Builder呢。。。[/quote]
老师逼得…… 经过努力现在差不多就剩这几个问题了,解决了以后再不做界面了。给点指点吧,一星半点也行啊

3 楼

EM_SETSEL 消息可用于将 Windows 编辑控件中的选定的文本的区域。范围的起始和结束位置设置为相同位置,如果没有选定任何区域,可以将插入符号放置在该位置。若要将插入符号放置在 Windows 编辑控件中文本的末尾,并将焦点设置到编辑控件执行以下操作:

   HWND hEdit = GetDlgItem (hDlg, ID_EDIT);
   int ndx = GetWindowTextLength (hEdit);
   SetFocus (hEdit);
   SendMessage (hEdit, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx);

后插入符号放置在编辑控件中的最后,您可以使用该 EM_REPLACESEL 将文本追加到编辑控件。应用程序发送到替换 lpszReplace (lParam) 参数所指定文本在编辑控件中的当前所选内容 EM_REPLACESEL 邮件。 因为当前没有选定内容在当前插入符号位置插入替换文本。本示例将所选内容设置为编辑控件的末尾,并将文本插入到缓冲区中:

   SendMessage (hEdit, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx);
   SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) ((LPSTR) szBuffer));


节选自MSDN:)
参考这个改你的程序吧:)

4 楼

[quote]EM_SETSEL 消息可用于将 Windows 编辑控件中的选定的文本的区域。范围的起始和结束位置设置为相同位置,如果没有选定任何区域,可以将插入符号放置在该位置。若要将插入符号放置在 Windows 编辑控件中文本的末尾,并将焦点设置到编辑控件执行以下操作:

   HWND hEdit = GetDlgItem (hDlg, ID_EDIT);
   int ndx = GetWindowTextLength (hEdit);
   SetFocus (hEdit);
   SendMessage (hEdit, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx);

后插入符号放置在编辑控件中的最后,您可以使用该 EM_REPLACESEL 将文本追加到编辑控件。应用程序发送到替换 lpszReplace (lParam) 参数所指定文本在编辑控件中的当前所选内容 EM_REPLACESEL 邮件。 因为当前没有选定内容在当前插入符号位置插入替换文本。本示例将所选内容设置为编辑控件的末尾,并将文本插入到缓冲区中:

   SendMessage (hEdit, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx);
   SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) ((LPSTR) szBuffer));


节选自MSDN:)
参考这个改你的程序吧:)[/quote]

十分感谢您的用心回答,我试了一遍的确好用,并且教会我不用输出一整个字符串,只需要一直追加就可以了,精髓就在于EM_REPLACESEL,呵呵。再查了fortran的MSDN,发现有好多的EM_消息,我发现我的前方充满了希望。再次谢谢你。

5 楼

呵呵,不客气,好好儿玩儿吧。MSDN里有很多有用的东西:)

6 楼

[quote]呵呵,不客气,好好儿玩儿吧。MSDN里有很多有用的东西:)[/quote]
呵呵,好

我来回复

您尚未登录,请登录后再回复。点此登录或注册