创建功能区样式的应用程序。

| 我注意到使用标准的Delphi TRibbon组件并不那么出色。 首先,它们看起来不像微软的那样好,例如TRibbon中的发光效果和颜色看起来不像Windows 7中的写字板或绘画中使用的那样令人印象深刻。 其次,如果要创建功能区样式的界面,我会注意到没有独立于TRibbon的功能区样式菜单或弹出菜单。对于实际的功能区,有一个功能区,但是如果出于连续性目的而说,例如,您希望将功能区样式弹出菜单分配给TListbox或TListView,那么似乎没有一个功能区。 第三,有时禁用功能区操作时,即使已禁用,它仍会显示热发光效果,就像将鼠标悬停在该操作上一样。 最终,我发现尝试将诸如TCombobox之类的容器组件放入组中非常奇怪。调整控件和位置等的大小确实很尴尬。 我想我的观点是,使用标准的Delphi TRibbon组件在视觉上和使用上似乎都不是最佳方法。如何像我在Windows 7中使用Wordpad和Paint之前所说的那样,使功能区样式的应用程序外观和工作方式像Microsoft一样整洁? 请看下面的比较屏幕截图,以获得更好的主意: 除非我期望太多,否则Delphi功能区似乎并不完整。我相信,Ribbon组件将为最终用户提供视觉和更好的工作空间等更好的体验。 您可以提出什么建议来增强或使TRibbon发挥作用并看起来像Microsoft? 我不会一直使用功能区样式接口,因此,我并不是真正想购买第3方组件。我已经看过TMS和DevExpress了,但是就它们的价格而言,它们也不是那么好。 TMS的外观比标准的Delphi TRibbon差。     
已邀请:
        有关本机的外观,请查看Windows Delphi的Windows Ribbon Framework。 这是Windows 7(自安装某些正式更新后的Vista)以来围绕Windows Ribbon框架提供的开源包装。这是Windows 7 Word Pad使用的API。 还要注意,您有两种布局:Office 2007和Office2010。Delphi VCL Ribbon实现Office 2007样式,而Windows Seven WordPad使用Office 2010样式。 在一些针对某些客户的项目中,我们使用了TMS软件功能区组件。该代码有点过大(很多重复项或糟糕的书面内容,例如组件持久性),但它可以正常工作并呈现良好,同时支持2007和2010 Ribbon样式。对于我们的客户而言,渲染至关重要。对于我们的开源框架,我们发布了一种双重解决方案,用于构建从代码生成的功能区式GUI:它将使用标准VCL组件进行基本布局,或者使用TMS组件进行完整的Office 2007/2010渲染。我们只是定义了一些类,由这两个库实现。如果您在自己的代码中使用SQLite3ToolBar中定义的通用组件(即
TSynForm, TSynToolBar, TSynToolButton, TSynPopupMenu, TSynPage, TSynPager, TSynBodyPager
TSynBodyPage
类)和SynTaskDialog(针对ѭ2the),则USETMSPACK条件将为您解决所有难题。 我们还没有使用Delphi 2009中引入的Ribbon组件。它的动作驱动设计不会轻易与用户界面处理的事件驱动设计进行交互,我们必须承认这一点。组件的信誉很差(至少在Delphi 2009版本中)。 出色的Delphi Windows Ribbon Framework无法满足我们对通过代码即时生成的Ribbon的需求。它的设计来自Microsoft实现本身,它是从XML资源创建UI的,并在编译时进行链接...因此它不符合我们的需求,但可能更适合您的“静态”应用程序UI设计。 如果您在应用程序中使用类似Office的功能区,请注意Office UI许可。     
        务实的答案是使用另一个组件集。 TMS软件版本看起来不错,但我使用的DevExpress ExpressBars对我来说效果很好。     
我使用Windows Ribbon Framework-Windows(7)附带的本机组件。 这是来自Delphi的Windows Ribbon Framework的超简短入门;复制代码的重要部分,无需过多解释:
procedure TfrmTicketDetail.ShowScenicRibbon;
begin
    try
        Fframework := UIRibbon.CoUIRibbonFramework.Create;
        Fframework.Initialize(Self.Handle, Self); //Give the ribbon the hwnd, and our implementation of uiapplication for callbacks
        OleCheck(Fframework.LoadUI(hInstance, \'APPLICATION_RIBBON\'));
    except
        on e:Exception do
        begin
            if DebugHook > 0 then
                raise;
            Exit;
        end;
    end;
end;
但是由于您必须遵循Microsoft的API,它开始变得多毛。
{IUIApplication}
function  OnViewChanged(viewId: SYSUINT; typeID: UI_VIEWTYPE; const view: IUnknown;
      verb: UI_VIEWVERB; uReasonCode: SYSINT): HResult; stdcall;
function  OnCreateUICommand(commandId: SYSUINT; typeID: UI_COMMANDTYPE;
      out commandHandler: IUICommandHandler): HResult; stdcall;
function  OnDestroyUICommand(commandId: SYSUINT; typeID: UI_COMMANDTYPE;
      const commandHandler: IUICommandHandler): HResult; stdcall;
然后必须实现它们:
function TfrmTicketDetail.OnViewChanged(viewId: SYSUINT;
     typeID: UI_VIEWTYPE; const view: IUnknown; verb: UI_VIEWVERB;
     uReasonCode: SYSINT): HResult;
var
    cy: integer;
begin
    Result := S_OK;

    //viewID: The ID for the view. Only a value of zero is valid.
    if viewID <> 0 then
       Exit;

    //typeID: The only declared typeID is UI_VIEWTYPE_RIBBON
    if typeID <> UI_VIEWTYPE_RIBBON then
       Exit;

    case verb of //there are only 4 verbs: create, destroy, size, error
    UI_VIEWVERB_CREATE:
        begin
            {   The view was resized.
                In the case of the Ribbon view, the application should call
                GetHeight() to determine the height of the Ribbon.}
            (view as IUIRibbon).GetHeight(cy);
            bvTopSpacer.Height := cy;
        end;
    UI_VIEWVERB_SIZE:
        begin
            {   The view was resized.
                In the case of the Ribbon view, the application should call
                GetHeight() to determine the height of the Ribbon.}
            (view as IUIRibbon).GetHeight(cy);
            bvTopSpacer.Height := cy;
        end;
    UI_VIEWVERB_DESTROY: {nop};
    UI_VIEWVERB_ERROR: {nop};
    end;

    Result := S_OK;
end;

function TfrmTicketDetail.OnCreateUICommand(commandId: SYSUINT;
  typeID: UI_COMMANDTYPE; out commandHandler: IUICommandHandler): HResult;
begin
    commandHandler := Self; //this form will handle all commands on the ribbon;
    Result := S_OK;
end;

function TfrmTicketDetail.OnDestroyUICommand(commandId: SYSUINT; typeID: UI_COMMANDTYPE;
      const commandHandler: IUICommandHandler): HResult;
begin
   Result := E_NOTIMPL;
end;
然后你还必须 实施
IUICommandHandler
编写功能区XML文件 使用功能区编译器编译功能区XML文件 将已编译的功能区作为资源包括在内:
{$RESOURCE \'..\\Resource\\UIRibbon\\Ribbon_frmTicketDetails.res\'}
这是我为我的应用程序准备的功能区xml的转储:
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<Application xmlns=\"http://schemas.microsoft.com/windows/2009/Ribbon\">

    <!-- Commands are like actions, with a name, a numeric ID, caption (LabelTitle), Large and Small images, etc -->
    <Application.Commands>
        <Command Name=\"cmdNew\" Id=\"0xE100\" Symbol=\"ID_CMD_NEW\" LabelTitle=\"New document\" />
        <Command Name=\"cmdSaveAs\" Id=\"0xE102\" Symbol=\"ID_CMD_SAVEAS\" LabelTitle=\"Save as\" />
        <Command Name=\"cmdOpen\" Id=\"0xE103\" Symbol=\"ID_CMD_OPEN\" LabelTitle=\"Open\" />
        <Command Name=\"cmdExit\" Id=\"0xE104\" Symbol=\"ID_CMD_EXIT\" LabelTitle=\"Exit\" />
        <Command Name=\"cmdUndo\" Id=\"0xE105\" Symbol=\"ID_CMD_UNDO\" LabelTitle=\"Undo\" />

        <Command Name=\"cmdCut\" Id=\"0xE110\" Symbol=\"ID_CMD_CUT\" LabelTitle=\"Cut\" />
        <Command Name=\"cmdCopy\" Id=\"0xE111\" Symbol=\"ID_CMD_COPY\" LabelTitle=\"Copy\" />
        <Command Name=\"cmdPaste\" Id=\"0xE112\" Symbol=\"ID_CMD_PASTE\" LabelTitle=\"Paste\" />
        <Command Name=\"cmdDelete\" Id=\"0xE113\" Symbol=\"ID_CMD_DELETE\" LabelTitle=\"Delete\" />
        <Command Name=\"cmdZoom\" Id=\"0xE114\" Symbol=\"ID_CMD_ZOOM\" LabelTitle=\"Zoom\" />

        <Command Name=\"tabHome\" LabelTitle=\"Home\" />

            <Command Name=\"grpActions\" LabelTitle=\"Actions\" />
                <Command Name=\"cmdSaveAndClose\" Id=\"1101\" Symbol=\"ID_ACTION_SAVEANDCLOSE\" LabelTitle=\"Save and Close\">
                    <Command.TooltipTitle>Save and Close (Alt+S)</Command.TooltipTitle>
                    <Command.TooltipDescription>Saves the current ticket and closes the detail screen.</Command.TooltipDescription>
                    <Command.LargeImages>
                        <Image Source=\"SaveAndClose.bmp\" />
                    </Command.LargeImages>
                </Command>
                <Command Name=\"cmdBack\" Id=\"1102\" LabelTitle=\"Back\" />
                <Command Name=\"cmdControlPanel\" Id=\"1103\" LabelTitle=\"Control Panel\" />
                <Command Name=\"cmdSave\" Id=\"1104\" LabelTitle=\"Save\" />

            <Command Name=\"grpShow\" Id=\"1201\" LabelTitle=\"Show\" />
                <Command Name=\"cmdShowTicket\" Id=\"1202\" LabelTitle=\"Ticket\" ></Command>
                <Command Name=\"cmdShowDiaryEntries\" Id=\"1203\" LabelTitle=\"Diary Entries\" >
                    <Command.LargeImages>
                        <Image Source=\"PencilLog_32x32.bmp\" />
                    </Command.LargeImages>
                </Command>
                <Command Name=\"cmdShowAttachments\" Id=\"1204\" LabelTitle=\"Attachments\" />
                <Command Name=\"cmdShowAuditLog\" Id=\"1205\" LabelTitle=\"Audit Log\" />
                <Command Name=\"cmdShowAdditional\" Id=\"1206\" LabelTitle=\"Additional\" />

            <Command Name=\"grpActivity\" LabelTitle=\"Activity\" />
                <Command Name=\"cmdStartWorking\" Id=\"1301\" LabelTitle=\"Start Working\"></Command>
                <Command Name=\"cmdStopWorking\" Id=\"1302\" LabelTitle=\"Stop Working\"></Command>
                <Command Name=\"cmdPrint\" Id=\"1303\" LabelTitle=\"Print\" >
                    <Command.LargeImages>
                        <Image Source=\"Printer - 256x256.bmp\" />
                    </Command.LargeImages>
                    <Command.SmallImages>
                        <Image Source=\"Printer_16x16.bmp\" />
                    </Command.SmallImages>
                </Command>
                <Command Name=\"cmdDuplicateTicket\" Id=\"1304\" LabelTitle=\"Duplicate Ticket\" >
                    <Command.SmallImages>
                        <Image Source=\"DuplicateTicket16.bmp\" />
                    </Command.SmallImages>
                </Command>

            <Command Name=\"grpTicketStatus\" LabelTitle=\"Ticket Status\" />
                <Command Name=\"cmdCloseTicket\" Id=\"1402\" LabelTitle=\"Close Ticket\" />
                <Command Name=\"cmdOnHold\" Id=\"1403\" LabelTitle=\"On Hold\" />
                <Command Name=\"cmdReadyForInstall\" Id=\"1404\" LabelTitle=\"Ready for install\" />
                <Command Name=\"cmdReopenTicket\" Id=\"1405\" LabelTitle=\"Reopen Ticket\" />

    </Application.Commands>

    <!-- Above is all the commands (i.e. Actions). Now we get to the tool on screen (i.e. a DFM) -->
    <Application.Views>
        <Ribbon>

            <!-- Items that appear under the \"round button\" menu -->
            <Ribbon.ApplicationMenu>
                <ApplicationMenu CommandName=\"cmdFileMenu\">
                    <MenuGroup>
                        <Button CommandName=\"cmdNew\" />
                        <Button CommandName=\"cmdOpen\" />
                        <Button CommandName=\"cmdSave\" />
                        <Button CommandName=\"cmdSaveAs\" />
                    </MenuGroup>
                    <MenuGroup>
                        <Button CommandName=\"cmdExit\" />
                    </MenuGroup>
                </ApplicationMenu>
            </Ribbon.ApplicationMenu>

            <!--What commands to add to the quick access toolbar
                    Right now only Save and Undo, just for fun-->
            <Ribbon.QuickAccessToolbar>
                <QuickAccessToolbar>
                    <QuickAccessToolbar.ApplicationDefaults>
                        <Button CommandName=\"cmdSave\" />
                        <Button CommandName=\"cmdUndo\" />
                    </QuickAccessToolbar.ApplicationDefaults>
                </QuickAccessToolbar>
            </Ribbon.QuickAccessToolbar>

            <!-- And now finally the actual tabs -->
            <Ribbon.Tabs>
                <!--Our one and only tab is \"Home\" -->
                <Tab CommandName=\"tabHome\">
                    <Tab.ScalingPolicy>
                        <ScalingPolicy>
                            <ScalingPolicy.IdealSizes>
                                <Scale Group=\"grpActions\" Size=\"Medium\"/>
                                <Scale Group=\"grpShow\" Size=\"Medium\"/>
                                <Scale Group=\"grpActivity\" Size=\"Medium\"/>
                                <Scale Group=\"grpTicketStatus\" Size=\"Medium\"/>
                            </ScalingPolicy.IdealSizes>
                            <Scale Group=\"grpActions\" Size=\"Small\"/>
                            <Scale Group=\"grpShow\" Size=\"Small\"/>
                            <Scale Group=\"grpActivity\" Size=\"Small\"/>
                            <Scale Group=\"grpTicketStatus\" Size=\"Small\"/>
                        </ScalingPolicy>
                    </Tab.ScalingPolicy>

                    <!-- Home\\Actions -->
                    <Group CommandName=\"grpActions\" SizeDefinition=\"FourButtons\">
                        <Button CommandName=\"cmdSaveAndClose\" />
                        <Button CommandName=\"cmdBack\" />
                        <Button CommandName=\"cmdControlPanel\" />
                        <Button CommandName=\"cmdSave\" />
                    </Group>

                    <!-- Home\\Show group -->
                    <Group CommandName=\"grpShow\" SizeDefinition=\"FiveButtons\">
                        <ToggleButton CommandName=\"cmdShowTicket\" />
                        <ToggleButton CommandName=\"cmdShowDiaryEntries\" />
                        <ToggleButton CommandName=\"cmdShowAttachments\" />
                        <ToggleButton CommandName=\"cmdShowAuditLog\" />
                        <ToggleButton CommandName=\"cmdShowAdditional\" />
                    </Group>

                    <!-- Home\\Activity group, with a custom sizing definition 
                            so i get my \"FourButtons-TwoBigTwoSmall\" look -->
                    <Group CommandName=\"grpActivity\" >
                        <SizeDefinition>
                            <ControlNameMap>
                                <ControlNameDefinition Name=\"button1\"/>
                                <ControlNameDefinition Name=\"button2\"/>
                                <ControlNameDefinition Name=\"button3\"/>
                                <ControlNameDefinition Name=\"button4\"/>
                            </ControlNameMap>
                            <GroupSizeDefinition Size=\"Large\">
                                <ControlSizeDefinition ControlName=\"button1\" ImageSize=\"Large\" IsLabelVisible=\"true\" />
                                <ControlSizeDefinition ControlName=\"button2\" ImageSize=\"Large\" IsLabelVisible=\"true\" />
                                <ColumnBreak ShowSeparator=\"true\"/>
                                <ControlSizeDefinition ControlName=\"button3\" ImageSize=\"Large\" IsLabelVisible=\"true\" />
                                <ControlSizeDefinition ControlName=\"button4\" ImageSize=\"Large\" IsLabelVisible=\"true\" />
                            </GroupSizeDefinition>
                            <GroupSizeDefinition Size=\"Medium\">
                                <ControlSizeDefinition ControlName=\"button1\" ImageSize=\"Large\" IsLabelVisible=\"true\" />
                                <ControlSizeDefinition ControlName=\"button2\" ImageSize=\"Large\" IsLabelVisible=\"true\" />
                                <ColumnBreak ShowSeparator=\"true\"/>
                                <Row>
                                    <ControlSizeDefinition ControlName=\"button3\" ImageSize=\"Small\" IsLabelVisible=\"true\" />
                                </Row>
                                <Row>
                                    <ControlSizeDefinition ControlName=\"button4\" ImageSize=\"Small\" IsLabelVisible=\"true\" />
                                </Row>
                            </GroupSizeDefinition>
                            <GroupSizeDefinition Size=\"Small\">
                                <Row>
                                    <ControlSizeDefinition ControlName=\"button1\" ImageSize=\"Small\" IsLabelVisible=\"true\" />
                                    <ControlSizeDefinition ControlName=\"button3\" ImageSize=\"Small\" IsLabelVisible=\"false\" />
                                </Row>
                                <Row>
                                    <ControlSizeDefinition ControlName=\"button2\" ImageSize=\"Small\" IsLabelVisible=\"true\" />
                                    <ControlSizeDefinition ControlName=\"button4\" ImageSize=\"Small\" IsLabelVisible=\"false\" />
                                </Row>
                            </GroupSizeDefinition>
                        </SizeDefinition>

                        <Button CommandName=\"cmdStartWorking\" />
                        <Button CommandName=\"cmdStopWorking\" />
                        <Button CommandName=\"cmdPrint\" />
                        <Button CommandName=\"cmdDuplicateTicket\" />
                    </Group>

                    <!-- Home\\Ticket Status group -->
                    <Group CommandName=\"grpTicketStatus\" SizeDefinition=\"FourButtons\">
                        <Button CommandName=\"cmdCloseTicket\" />
                        <Button CommandName=\"cmdOnHold\" />
                        <Button CommandName=\"cmdReadyForInstall\" />
                        <Button CommandName=\"cmdReopenTicket\" />
                    </Group>
                </Tab>
            </Ribbon.Tabs>
            <!-- End of the actual tabs -->

        </Ribbon>
    </Application.Views>
</Application>
    

要回复问题请先登录注册