type TMyEdit = class(TEdit) procedure IMEMsg(var Msg: TMessage); message WM_IME_NOTIFY ; end; { TMyEdit }procedure TMyEdit.IMEMsg(var Msg: TMessage); begin inherited; if Msg.wParam = IMN_SETCONVERSIONMODE then begin if (Perform(WM_IME_CONTROL, IMC_GETCONVERSIONMODE, 0) and IME_CMODE_FULLSHAPE) <> 0 then Showmessage('1') else ShowMessage('0'); end; end;就是其中的IMC_GETCONVERSIONMODE报错,说是未定义:(
我这里怎么不行? if Msg.wParam = IMN_SETCONVERSIONMODE then begin if (Perform(WM_IME_CONTROL, 1, 0) and IME_CMODE_FULLSHAPE) <> 0 then Showmessage('1') else ShowMessage('0'); end;这样在打开输入法,还有切换全角半角的时候都是show个0出来。 另外说一下,我的输入法是紫光
请问“半/全角”改变的消息是什么?
如果没有该消息,那怎么处理?
个人感觉全角和半角的切换已经是输入法本身的操作,和windows消息没有关系了吧。
TMyEdit = class(TEdit)
procedure IMEMsg(var Msg: TMessage); message WM_IME_NOTIFY ;
end; { TMyEdit }procedure TMyEdit.IMEMsg(var Msg: TMessage);
begin
inherited;
if Msg.wParam = IMN_SETCONVERSIONMODE then
begin
if (Perform(WM_IME_CONTROL, IMC_GETCONVERSIONMODE, 0) and IME_CMODE_FULLSHAPE) <> 0 then
Showmessage('1')
else
ShowMessage('0');
end;
end;就是其中的IMC_GETCONVERSIONMODE报错,说是未定义:(
那你这代码怎么用能呀?
那你这代码怎么用能呀?
我这不也等着高人指点呢吗
那你这代码怎么用能呀?
我这不也等着高人指点呢吗
===============================
关键是你这些代码是哪里找到的呀?
我把它定义为1后,可以正常运行呢
if Msg.wParam = IMN_SETCONVERSIONMODE then
begin
if (Perform(WM_IME_CONTROL, 1, 0) and IME_CMODE_FULLSHAPE) <> 0 then
Showmessage('1')
else
ShowMessage('0');
end;这样在打开输入法,还有切换全角半角的时候都是show个0出来。
另外说一下,我的输入法是紫光
就我所知,程序自己只能得到输入法打开关闭的消息
immsimulateHotkey(handle,
IME_CHotKey_shape_Toggle);//切换半角和全角模式
imClose 表示输入法处于关闭状态;
ImOpen 表示输入法处于打开状态;
ImChinese 表示处于中文输入法状态;
ImDontCare 表示若输入法处于关闭状态则打开最近一次使用过的输入法;
ImSAlpha 表示输入处于半角状态;
ImAlpha 表示输入处于全角状态。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Clipbrd, JPEG;type
TForm1 = class(TForm)
Panel1: TPanel;
Edit1: TEdit;
Memo1: TMemo;
Button1: TButton;
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FHEdit: TWndMethod;
procedure EditWndProc(var Message: TMessage);
function CaptureScreen:TBitmap;
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses U_ClipBoard;{$R *.dfm}procedure TForm1.EditWndProc(var Message: TMessage);
var
i: Integer;
strClipBrd, strReplaced: string;
TmpStream: TStream;
begin
case message.Msg of
WM_PASTE:
begin
if Clipboard.HasFormat(CF_TEXT) then
begin
strClipBrd := Clipboard.AsText;
for i := 1 to Length(strClipBrd) do
if Ord(strClipBrd[i]) < $A1 then
strReplaced := strReplaced + strClipBrd[i];
Clipboard.AsText := strReplaced;
FHEdit(Message);
Clipboard.AsText := strClipBrd;
Exit;
end;
end;
WM_KEYDOWN:
begin end;
WM_KEYUP:
begin end;
WM_CHAR:
begin
if Message.WParam >= $A1 then Message.WParam := 0;
end;
end;
FHEdit(Message);
end;procedure TForm1.FormShow(Sender: TObject);
begin
FHEdit := Edit1.WindowProc;
Edit1.WindowProc := EditWndProc;
end;procedure TForm1.Button1Click(Sender: TObject);
var
bmp: TBitmap;
begin
try
bmp := TBitmap.Create;
bmp.Assign(CaptureScreen);
bmp.SaveToFile('c:\12.bmp');
finally
bmp.Free;
end;
end;function TForm1.CaptureScreen:TBitmap;
var
DC : HDC;
ABitmap:TBitmap;
begin
DC := GetDC (GetDesktopWindow);
ABitmap:=TBitmap.Create;
try
ABitmap.Width := GetDeviceCaps (DC, HORZRES);
ABitmap.Height := GetDeviceCaps (DC, VERTRES);
BitBlt(ABitmap.Canvas.Handle, 0, 0, ABitmap.Width,
ABitmap.Height,DC, 0, 0, SRCCOPY);
finally
ReleaseDC(GetDesktopWindow, DC);
end;
Result:=ABitmap;
end; end.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Clipbrd, JPEG;procedure ClipBrdToPict(const FileName: string);implementationprocedure ClipBrdToPict(const FileName: string);
var
jpg: TJPEGImage;
bmp: TBitmap;
begin
bmp := TBitmap.Create;
try
bmp.Assign(Clipboard);
jpg := TJPEGImage.Create;
try
jpg.Assign(bmp);
jpg.CompressionQuality := 80;
jpg.Compress;
jpg.SaveToFile(FileName);
finally
jpg.Free;
end;
finally
bmp.Free;
end;
end;end.
*************************摘自JackySoft技朮大全**********************************
************http://home.91i.net/jackysoft/database/download.htm*****************用DELPHI设计屏幕保护程序
屏幕保护程序是一类特殊的WINDOWS程序。如果已安装了屏幕保护程序,超过等待时间没有鼠标和键盘操作,WINDOWS会自动运行屏幕保护程序以保护屏幕。在休息之余,欣赏一下漂亮的WINDOWS屏幕保护,使人赏心悦目。那么设计屏幕保护程序要注意哪些方面?由于屏幕保护程序需满足一些特殊条件,比如屏幕保护程序只能有一个实例运行,运行后一旦使用鼠标或键盘应立即结束程序,能接受参数等。设计屏幕保护程序要充分考虑到这些,本文探讨用DELPHI制作一个屏幕保护程序(以下简称SCR),最后给出一个可运行的实例。----一、TCanvas与TBitMap对象、JPEG对象:
----DELPHI的TCanvas封装了大部分WINDOWS对图形的操作,SCR运行时各种图像千变万化、图形变幻无不是TCanvas的"杰作"。TBitMap对象有一个LoadFromFile()方法,能从BMP图像文件取得位图。一般情况下,设计SCR要创建至少一个TBitMap对象,由于窗体和TBitMap对象都有Canvas属性,可利用TCanvas中的各种函数设计图像。设计一个有各种图像变化效果的SCR常用到以下函数:----1、CopyRect方法:从其原型CopyRect(Dest:TRect;Canvas:TCanvas;Source:TRect)可看出,它将源画布某一矩形区域的图像复制到另一个画布的矩形区域。由于是内存的成块复制,因此具有很高的执行效率。在Timer组件的OnTimer事件程序中灵活使用该函数,可以设计出各种美观演示效果:如百叶窗、推拉、马赛克、随机线、反像等等。将以下代码加入到OnTimer事件程序,可演示各种图像效果,这里仅举出两种效果,读者可参考有关资料设计更多更漂亮的演示效果。
......
case PlayMode of
0:begin //从左向右移动(设x初值为Screen.Width)
x:=x-10;
SCRSaverFrom.CopyRect(Rect(x,0,x+10,Screen.Height),Bit.Canvas,Rect(x,0,x+10,Screen.Height));
if x=0 then ChangePictureAndPlayMode;//改变图像及演示模式
end;
1:begin //马赛克
for i:=0 to Screen.Width*Screen.Height div 10 do
begin
j := Random(Screen.Width div 4)*4;
k := Random(Screen.Height div 4)*4;
SCRSaverFrom.CopyRect(Rect(j,k,j+4,k+4),Bit.Canvas,Rect(j,k,j+4,k+4));
end;SCRSaverFrom.CopyRect(Rect(0,0,Screen.Width,Screen.Height),Bit.Canvas,Rect(0,0,Screen.Width,Screen.Height));
ChangePictureAndPlayMode; //改变图像及演示模式
end;
2: ......
......
end;----2、StretchDraw方法:一般说来,使用CopyRect方法要求源矩形与目的矩形应相等,如果两者尺寸相差太大时,色彩可能失真。使用StretchDraw能避免这个问题,其原型为:StretchDraw(constRect:TRect;Graphic:TGraphic)。它可在画布指定的矩形区域内完整地“画”出一个图像,如果源图象区域与目的区域尺寸不一致,会自动Stretch(拉伸),能有效的避免色彩失真。但此函数只能"画"出整个图像,如果只需“画”出一部分图像则应配合CopyRect()使用,先用StretchDraw()使整幅位图变形"输出到一个画布,然后再用CopyRect()函数将所需部分“画出”。----3、TextOut方法:在指定的位置输出一串文字。在Canvas中还有很多函数可绘制图形,也能用于SCR的设计,这里就不加介绍。----4、支持JPEG图像。由于JPEG图像格式具有很好的压缩性能,是最常用的图像格式之一。DELPHI3/4中新加入了对JPEG图像的支持,JpegImage是TGraphic的派生类,它的LoadFromFile方法可从JPEG文件取出一幅图像,JpegImage没有Canvas属性,不能用CopyRect()方法,但其它画布可用StretchDraw()方法显示出一个JPEG图像,就将JPEG图像转换成位图。请看下面例子,其中Bit为全局的TBitMap对象。注意:使用JpegImage应在USES中加入JPEG单元。
procedure LoadBMPFromJPEG(JPEGFileName:String);
// 从JPEG 文 件 中 取 图 像
var JpegImage1:TJpegImage;
begin
JpegImage1 := TJpegImage.Create;
JpegImage1.LoadFromFile(JPEGFileName);
Bit.Width := JpegImage1.Width ;
// 使 位 图 与JPEG 图 像 尺 寸 相 等
Bit.Height := JpegImage1.Height ;
Bit.Canvas.StretchDraw(Rect(0,0,Bit.Width,Bit.Height),JpegImage1);
JpegImage1.Free ;
end;----二、MediaPlayer和Timer组件:
----MediaPlayer组件封装了MCI中绝大部分的功能,利用它很容易播放WAVE和
MIDI音乐,为SCR添加美妙的背景音乐。有关代码如下:
ifMediaPlayer1.Mode<>mpPLayingthen
//音乐播放完后,更换音乐
begin
inc(i);
MediaPlayer1.FileName:=IntToStr(i)+`.WAV`;
//逐一播放1.wav,2.wav...
MediaPlayer1.Open;
MediaPlayer1.Play;
end;
----Timer组件是一个定时器,它的Interval属性指定定时器的间隔时间,每隔指定的时间就会执行一次OnTimer事件,SCR的OnTimer事件内要完成演示图像,更换图像,检查音乐是否播放完毕,更换音乐等各项工作。因此,Timer是设计SCR程序必不可少的组件。