1.假定主菜单叫MainMenu1,在主窗体的OnActivate事件里——
procedure TForm1.FormActivate(Sender: TObject);
begin
HiliteMenuItem(Handle, MainMenu1.Handle, 0, MF_BYPOSITION or MF_HILITE);//使主菜单第一项产生下压的效果
with ClientToScreen(Point(0, 0)) do//转换窗体坐标为屏幕坐标,这是下一行的API所要求的
TrackPopupMenuEx(MainMenu1.Items[0].Handle, 0, X, Y, Handle, nil);//将第一项的子菜单弹出来
HiliteMenuItem(Handle, MainMenu1.Handle, 0, MF_BYPOSITION or MF_UNHILITE);//解除“下压”状态
end;
2.为了这一个Cell要做很大的动作——
将StringGrid.Font.Color直接设为编辑时需要的颜色,如你所要求的clBlack;
StringGrid.DefaultDrawing设为False,就是说要在OnDrawCell事件里自己控制颜色了,如下:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
with StringGrid1.Canvas do begin
if gdFixed in State then begin//把固定区域的东东画出来
Brush.Color := StringGrid1.FixedColor;
FillRect(Rect);
DrawEdge(Handle, Rect, BDR_RAISEDINNER, BF_RECT);//关键!没有这一句将失去立体感
end else begin
Brush.Color := clBlack;//一般单元格的背景
Font.Color := clWhite;//和字体颜色
if State = [gdSelected] then begin//当焦点不在StringGrid上时选中格子的外观
Brush.Color := clHighLight;
Font.Color := clHighLightText;
end;
TextRect(Rect, Rect.Left + 2, Rect.Top + 2, StringGrid1.Cells[ACol, ARow]);//刷新格子并显示其中的文字内容
if gdFocused in State then DrawFocusRect(Rect);//当焦点在StringGrid上时选中格子的外观
end;
end;
end;
这段代码在实现你的要求的前提下尽量模拟了标准StringGrid的外观变化行为,
至于进入编辑状态时的Font的属性就不必在这里考虑了,因为这时我们看到的是StringGrid的
嵌入式编辑器(InplaceEditor),而StringGrid本身的部分被它挡住了。
它的Font是由StringGrid本身决定的,所以我们不得不事先设定StringGrid.Font,也因此才必须写OnDrawCell事件。
试试看行不行吧。