当前位置:编程学习 > VB >>

已知窗口hWnd,如何修改其字体大小?

hWnd不是自己的窗口,就是修改它的hFont,修改到指定的字体大小,该怎么做? --------------------编程问答-------------------- 应该不行,因为跨进程后,得不到远程进程的内部设备号,
即使能得到,因为内存区域不同(每个进程都有独立的区域),
所以也会操作失败,所以也就无法设置那个设备的字体。
不过据说可以通过进程注入的方式将自己的线程注入其中,
这样一来就可共享同一进程的资源,便可实现对目标设备的
设置。不过即使注入成功,若非自己的程序,也很难得到
目标设备原始的设备地址指针,多半得到的是新开辟的设备
句柄,这样同样会操作无效。 --------------------编程问答-------------------- 不过对于有hWnd的设备来说可能会不同也不一定,你可以尝试一下用
GetWindowDC 或 GetDC
来取得设备句柄,然后用
CreateFontIndirect
创建字体,用
SelectObject
将字体对象选入设备 --------------------编程问答-------------------- 我拿窗体的TextBox做实验,为什么我这样写不行?

Dim f As Long
f = CreateIFont(8)
MsgBox f
MsgBox SelectObject(GetWindowDC(Text1.hwnd), f)

其中CreateIFont的原型是
Public Function CreateIFont(ByVal nSize As Integer) As Long
Dim lFont As LOGFONT
lFont.lfHeight = -MulDiv(nSize, GetDeviceCaps(GetDC(0), 90), 72)
lFont.lfCharSet = DEFAULT_CHARSET
lFont.lfCharSet = DEFAULT_CHARSET ' use default character set
lFont.lfOutPrecision = OUT_DEFAULT_PRECIS ' default precision mapping
lFont.lfClipPrecision = CLIP_DEFAULT_PRECIS ' default clipping precision
lFont.lfQuality = DEFAULT_QUALITY ' default quality setting
lFont.lfPitchAndFamily = DEFAULT_PITCH Or FF_ROMAN ' default pitch, proportional with serifs
CreateIFont = CreateFontIndirect(lFont)
End Function
--------------------编程问答-------------------- 顶起,召唤高手。。。

我查到了有个WM_SETFONT消息,发送消息给自己进程的窗体没问题,但是发给其他窗体就不行了。。。

有没有其他办法? --------------------编程问答-------------------- 估计就是跨进程的原因 --------------------编程问答-------------------- 修改字体即可啊?
例:

hfont=CreateFont ( 30,20, 0, 0, 0,0,0,0,
GB2312_CHARSET,  
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH & FF_DONTCARE,
"黑体");

具体这个CreateFont(),最好还是CSDN一下,比我权位一点。

以上。 --------------------编程问答-------------------- UPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUP --------------------编程问答-------------------- 回复5L:
我3L的代码对自己窗体中的TextBox处理也失败,是什么原因?

回复6L:
这个我也会,但是如何把创建的字体赋给hWnd? --------------------编程问答-------------------- 进程:
  进程含有内存和资源。资源包括核心对象(如file handles和线程)、USER资源(如对话框和字符串)、GDI资源(如Device Context和brushes)。 
--------
字体的句柄属于GDI资源,不能跨进程使用。所以不能直接指定字体。
除非两个进程有通讯约定,送过去字体名称、大小等参数,由对方进程自己 CreateFont 后进行字体更改。 --------------------编程问答-------------------- 用样一个程序运行两个实例后,将第二个实例的Text2内容设置成第一个实例的Text1内容,
然后点按钮看看

Private Const FW_NORMAL = 400
Private Const OUT_DEFAULT_PRECIS = 0
Private Const CLIP_DEFAULT_PRECIS = 0
Private Const DEFAULT_CHARSET = 1
Private Const FF_DONTCARE = 0    '  Don't care or don't know.
Private Const PROOF_QUALITY = 2
Private Const DEFAULT_PITCH = 0
Private Declare Function CreateFont Lib "gdi32" Alias "CreateFontA" (ByVal h As Long, ByVal W As Long, ByVal E As Long, ByVal O As Long, ByVal W As Long, ByVal I As Long, ByVal u As Long, ByVal S As Long, ByVal C As Long, ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, ByVal PAF As Long, ByVal F As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_SETFONT = &H30
Private Sub Command1_Click()
   Dim FontHeader As Long
   FontHeader = CreateFont(12, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH Or FF_DONTCARE, "Arial Black")
   SendMessage CLng(Text2.Text), WM_SETFONT, FontHeader, ByVal 0&
End Sub

Private Sub Form_Load()
   Text1.Text = Text1.hwnd
End Sub


--------------------编程问答-------------------- 貌似无法跨进程使用。。。

除了进程注入就没办法了吗?
补充:VB ,  API
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,