Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface CAknView容器内的CAknSlider控件(不作为设置项)_User Interface_Symbian_Implementation - Fatal编程技术网

User interface CAknView容器内的CAknSlider控件(不作为设置项)

User interface CAknView容器内的CAknSlider控件(不作为设置项),user-interface,symbian,implementation,User Interface,Symbian,Implementation,我对本机Symbian组件的实现感到惊讶。其中之一是卡克斯利德。CAknSlider是一个控件,它有一个滑块,用户可以使用该滑块沿方向可以是垂直或水平的条滑动 现在,当您滑动滑块时,滑动非常平滑,不会闪烁。但是,如果出于某种原因,我要实现一个自定义的滑块控件,我就不会让它像CAknSlider那样整洁 所以我的问题是,我怎样才能弄清楚CAknSlider是如何在引擎盖下实现的。我想为我的无线电应用程序实现一个自定义滑块,以控制音频流的音量 你知道我该怎么做吗 [编辑:回应laalto的评论]

我对本机Symbian组件的实现感到惊讶。其中之一是卡克斯利德。CAknSlider是一个控件,它有一个滑块,用户可以使用该滑块沿方向可以是垂直或水平的条滑动

现在,当您滑动滑块时,滑动非常平滑,不会闪烁。但是,如果出于某种原因,我要实现一个自定义的滑块控件,我就不会让它像CAknSlider那样整洁

所以我的问题是,我怎样才能弄清楚CAknSlider是如何在引擎盖下实现的。我想为我的无线电应用程序实现一个自定义滑块,以控制音频流的音量

你知道我该怎么做吗


[编辑:回应laalto的评论]

CAknSlider控件通常作为

我从未见过它在复合控件容器(如ccecontrol或CAknView)中实现为组件控件。这就是我迄今为止所尝试的:

首先,我创建了一个描述滑块控件的资源文件,如下所示:

RESOURCE SLIDER r_volume_slider
{
 layout=EAknCtSlider;
 minvalue=0;
 maxvalue=10;
 step=1;
 valuetype=EAknSliderValuePercentage;
 minlabel="mute";
 maxlabel="full";
}
void CVolumePopupAppView::ConstructL(const TRect& aRect)
{
// Create a window for this application view
CreateWindowL();

InitComponentArrayL( );
iSlider = new ( ELeave ) CAknSlider( );
TResourceReader reader;
iEikonEnv->CreateResourceReaderLC( reader, R_VOLUME_SLIDER );

iSlider->ConstructFromResourceL( reader );
CleanupStack::PopAndDestroy ( );
iSlider->SetContainerWindowL( *this );
iSlider->SetParent( this );

Components().AppendLC( iSlider );

CleanupStack::Pop ( iSlider );

// Set the windows size
SetRect(aRect);

// Activate the window, which makes it ready to be drawn
ActivateL();
}
然后,我使用源代码中的资源文件创建滑块,如下所示:

RESOURCE SLIDER r_volume_slider
{
 layout=EAknCtSlider;
 minvalue=0;
 maxvalue=10;
 step=1;
 valuetype=EAknSliderValuePercentage;
 minlabel="mute";
 maxlabel="full";
}
void CVolumePopupAppView::ConstructL(const TRect& aRect)
{
// Create a window for this application view
CreateWindowL();

InitComponentArrayL( );
iSlider = new ( ELeave ) CAknSlider( );
TResourceReader reader;
iEikonEnv->CreateResourceReaderLC( reader, R_VOLUME_SLIDER );

iSlider->ConstructFromResourceL( reader );
CleanupStack::PopAndDestroy ( );
iSlider->SetContainerWindowL( *this );
iSlider->SetParent( this );

Components().AppendLC( iSlider );

CleanupStack::Pop ( iSlider );

// Set the windows size
SetRect(aRect);

// Activate the window, which makes it ready to be drawn
ActivateL();
}

下面是作为设置项()的CAknSlider与通过上述技术()创建的CAknSlider之间的比较。请注意,即使我在资源中指定了百分比值指示器和最小和最大文本标签,我创建的标签也没有百分比值指示器和最小和最大文本标签。外观和感觉也很糟糕。

有很多技术可以避免闪烁,从双缓冲整个屏幕到更简单的优化,比如只重新绘制控件中实际更改的部分。在滑块所在位置和下一步的位置预先绘制适当的矩形,这可能是最简单的有效方法

要了解CAknSlider是如何做到这一点的,您可以: 1)在Symbian基金会平台上等待相关的软件包去开源(EPL)-应该在未来12个月的某个时候,或者 2)加入Symbian基金会,获取源代码

编辑:(响应有关图形优化更多详细信息的请求)

最常见的闪烁是由重新绘制整个控件引起的。我(通过一个移植项目)实现了一些在这里不会闪烁的自定义控件: 甚至有点像滑块。这个例子远非理想,它没有预先绘制的用于布点的矩形,但图形是非常简单的直线和填充矩形。不过,只覆盖更改的部分的概念是相同的。对预先绘制的部分进行blit。将滑块的背景绘制为屏幕外位图,并对滑块的可移动部分执行相同操作。移动滑块时,通过从屏幕外背景(仅需要擦除的部分)执行BitBlt()擦除可移动部分,然后BitBlt()将可移动部分移动到新位置


这有意义吗?

你需要卡恩斯里德吗?偷走它!:)CAknSliderSettingPage为我们做一切。我们就用这个

iSettingPage = new(ELeave) CAknSliderSettingPage(R_SLIDER_PAGE, iValue);
iSettingPage->ConstructL();

iSettingPage->SetSize(iSettingPage->MinimumSize());

TInt CCustomColorPalette::CountComponentControls() const
{
    return 1;
}

CCoeControl* CCustomColorPalette::ComponentControl( TInt aIndex ) const
{
   return iSettingPage->SliderControl();
}

如果您描述了迄今为止所做的尝试,这会有所帮助-如果有一些代码或伪代码可供评论,则更容易给出改进意见。顺便说一句,您可能会发现音量控制滑块有点令人失望,因为大多数诺基亚设备上的基本音频自适应实现只有10个离散音量,尽管API允许您在0和MaxVolume.Mark之间设置任意值,但在您的回答中,您提到“将预先绘制的矩形映射到blit…”是最简单的优化技术。你能给我指一个使用这种技术的示例应用程序吗,或者帮我解释一下如何使用这种技术。我会试试,让你知道我得到了什么。谢谢