Это, кажется, тонкая ошибка в шаблоне управления для GroupBox. Я нашел путем редактирования шаблона по умолчанию для GroupBox, и перемещение Границы под названием 'Заголовок' к последнему объекту в управлении обрабатывает элемент Сетки по шаблону, проблема разрешает себя.
причина состоит в том, что тот из других элементов Границы с TemplateBinding BorderBrush далее снизился в визуальном дереве и получал щелчок мышью, вот почему устанавливание в NULL BorderBrush позволило CheckBox правильно получать щелчок мышью.
Ниже заканчивается стиль для GroupBox. Это почти идентично шаблону по умолчанию для управления, за исключением элемента Границы под названием 'Заголовок', который является теперь последним ребенком Сетки, а не вторым.
<BorderGapMaskConverter x:Key="BorderGapMaskConverter"/>
<Style x:Key="GroupBoxStyle1" TargetType="{x:Type GroupBox}">
<Setter Property="BorderBrush" Value="#D5DFE5"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupBox}">
<Grid SnapsToDevicePixels="true">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="6"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="6"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="6"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Grid.ColumnSpan="4" Grid.Row="1" Grid.RowSpan="3" Background="{TemplateBinding Background}" BorderBrush="Transparent" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="4"/>
<ContentPresenter Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="2"/>
<Border Grid.ColumnSpan="4" Grid.Row="1" Grid.RowSpan="3" BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="4">
<Border.OpacityMask>
<MultiBinding Converter="{StaticResource BorderGapMaskConverter}" ConverterParameter="7">
<Binding Path="ActualWidth" ElementName="Header"/>
<Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}"/>
<Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}"/>
</MultiBinding>
</Border.OpacityMask>
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3">
<Border BorderBrush="White" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2"/>
</Border>
</Border>
<Border x:Name="Header" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" Padding="3,1,3,0">
<ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" ContentSource="Header" RecognizesAccessKey="True"/>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
use strncpy()
rather than strcpy()
/* code not tested */
#include <string.h>
int main(void) {
char *src = "gkjsdh fkdshfkjsdhfksdjghf ewi7tr weigrfdhf gsdjfsd jfgsdjf gsdjfgwe";
char dst[10]; /* not enough for all of src */
strcpy(dst, src); /* BANG!!! */
strncpy(dst, src, sizeof dst - 1); /* OK ... but `dst` needs to be NUL terminated */
dst[9] = '\0';
return 0;
}
use strncpy to be sure to not copy more charachters than the char[] can contains
char *s = "abcdef";
char c[6];
strncpy(c, s, sizeof(c)-1);
// strncpy is not adding a \0 at the end of the string after copying it so you need to add it by yourself
c[sizeof(c)-1] = '\0';
Edit: Code added to question
Viewing your code the segmentation fault could be by the line
strcpy(c, token)
The problem is if token length is bigger than c length then memory is filled out of the c var and that cause troubles.
char c[] must have some size;
for example
char c[]= "example init string";
// that set up table c to c[19]; You can allocate it directly at the begginign of Your program;
char c[19] = {0}; // null filled table
char c[i] is the pointer so You don't need to copy anything; char c[19] ; c = "example init string"; // now &c[0] points the same address;
Copy can be done wiht
strcpy(dst, src);
but MS force You to use secure function:
strcpy_s(dst,buffsize,src);
Прошло много времени с тех пор, как я кодировал c / c ++, но c [80], вероятно, размещен в стеке. Если вы используете char * c и strdup или что-то подобное, вы выделяете его в куче, где strtok может получить к нему доступ.
Попробуйте что-нибудь вроде этого.
char *token = "some random string";
char *c;
c = strdup(token);
char *broken = strtok(c, "#");
free(c);
Edited: Thanks for adding the code.
Perhaps the segfault occurs here:
strncpy(c, token, sizeof c - 1);
sizeof has a the same precedence as '-' from right to left, so it is probably processed as :
strncpy(c, token, sizeof( c - 1 ) );
instead of
strncpy(c, token, sizeof(c) - 1);
which is probably what you wanted
(reference: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence)