ProgressBarコントロールのラッパーを作成しています(実際には真のラッパーではありませんが、Vistaの機能を適切に実装しています)。そしてここに私のコードがあります:
/// <summary>
/// Encapsulates the information needed when creating a control
/// </summary>
protected override CreateParams CreateParams {
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
get {
CreateParams cp = base.CreateParams;
if (SmoothReverse) {
// Add using bitwise OR
cp.Style = cp.Style | PBS_SMOOTHREVERSE;
}
else {
// Remove using bitwise XOR
cp.Style = cp.Style ^ PBS_SMOOTHREVERSE;
}
if (Vertical) {
// Add using bitwise OR
cp.Style = cp.Style | PBS_VERTICAL;
}
else {
// Remove using bitwise XOR
cp.Style = cp.Style ^ PBS_VERTICAL;
}
return cp;
}
}
private bool m_SmoothReverse = false;
/// <summary>
/// Gets or sets a System.Boolean value indicating whether the SmoothReverse style is used
/// </summary>
[Category("Behavior")]
[DefaultValue(false)]
[Description("Gets or sets a System.Boolean value indicating whether the SmoothReverse style is used")]
public bool SmoothReverse {
get {
return m_SmoothReverse;
}
set {
m_SmoothReverse = value;
}
}
private bool m_Vertical = false;
/// <summary>
/// Gets or sets a System.Boolean value indicating whether the progress bar will be rendered vertically
/// </summary>
[Category("Behavior")]
[DefaultValue(false)]
[Description("Gets or sets a System.Boolean value indicating whether the progress bar will be rendered vertically")]
public bool Vertical {
get {
return m_Vertical;
}
set {
m_Vertical = value;
}
}
ただし、フォームにコントロールをドロップすると、PBS_SMOOTHを使用してVerticalとして開始されます。だから私の質問は、ビット単位の演算を使用してCreateParams.Styleに値を設定する前に、どのような追加のチェックを行う必要があるか、またはビット単位の演算(または実際のところ私のコード)は正しいですか?
Jon Skeetのおかげで更新 これを完全に修正して機能させることができました。UpdateStyles()を適用して新しいスタイルをプロパティでオンデマンドでapply()に強制すると、コントロールは期待どおりに機能し、洗練されます:)
/// <summary>
/// Encapsulates the information needed when creating a control
/// </summary>
protected override CreateParams CreateParams {
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
get {
CreateParams cp = base.CreateParams;
if (SmoothReverse) {
cp.Style |= PBS_SMOOTHREVERSE;
}
else {
cp.Style &= ~PBS_SMOOTHREVERSE;
}
if (Vertical) {
cp.Style |= PBS_VERTICAL;
}
else {
cp.Style &= ~PBS_VERTICAL;
}
return cp;
}
}
private bool m_SmoothReverse = false;
/// <summary>
/// Gets or sets a System.Boolean value indicating whether the SmoothReverse style is used
/// </summary>
[Category("Behavior")]
[DefaultValue(false)]
[Description("Gets or sets a System.Boolean value indicating whether the SmoothReverse style is used")]
public bool SmoothReverse {
get {
return m_SmoothReverse;
}
set {
m_SmoothReverse = value;
UpdateStyles();
}
}
private bool m_Vertical = false;
/// <summary>
/// Gets or sets a System.Boolean value indicating whether the progress bar will be rendered vertically
/// </summary>
[Category("Behavior")]
[DefaultValue(false)]
[Description("Gets or sets a System.Boolean value indicating whether the progress bar will be rendered vertically")]
public bool Vertical {
get {
return m_Vertical;
}
set {
m_Vertical = value;
UpdateStyles();
}
}