No puedes quitar un estilo de esa manera. Piensa que los estilos son realmente bits en un número que los agrupa todos.
El estilo es un entero que se interpreta en binario, cada bit (o grupo de bits concreto) corresponderá a un estilo
Realmente poner un estilo es por ejemplo "activar el bit 8".
Por eso
se hace con BitOr para añadir los estilos, si por ejemplo tengo este valor de estilos (lo pongo ya en binario, supongamos que es un sólo byte, aunque realmente son más):
10001001
Ahora quiero añadir el estilo
NoSel que vamos a inventarnos que es "
activar el 5º bit", se cuentan desde la derecha, (el 5º bit sería en realidad el número 4, pues empieza a contar desde cero, pero no hace falta liar la cosa).
El caso es que eso significa que nuestro estilo
NoSel es en binario
00010000 (un byte con el 5º bit a uno).
Para añadir ese estilo a nuestra máscara de estilos se hace un
OR binario, así si ya había un uno se deja como está (ya estaba activado), pero si estaba a cero (estaba desactivado) lo activamos:
10001001 OR 00010000 = 10011001
Con lo que hemos añadido el estilo pues la máscara final tiene el 5º bit a 1, que es el estilo
NoSel, y además
NO HEMOS TOCADO LOS OTROS ESTILOS QUE YA ESTABAN PUESTOS.
¿Para quitarlo si ya está puesto?
Pues para empezar habría que combinarlo con el que haya en ese momento, cosa que no haces, pero es que fíjate lo que significa lo que has puesto. Supongamos que en nuestro caso inventado quiero quitar
NoSel. Si hago
Not(NoSel) obtengo el negativo, es decir
BitNot(00010000)=11101111.
O sea,
he quitado el flag, sí, ¡¡pero he activado todos los demás!!, por eso te hace cosas raras, en realidad has activado un montón de estilos.
Cuando entiendas lo que he puesto hasta ahora (puede que tengas que leerlo varias veces si nunca has manejado esas cosas) quizás encuentres una manera de quitar los bits de tu estilo, que poderse se puede haciendo operaciones booleanas,
pero hay DOS problemas.
El primero es que hay estilos que comparten otros, y si quitas uno puedes dejar un estado inconsistente en la palabra de estilos, porque podrías dejar uno activado a medias.
Eso pasa por ejemplo mucho con los del GUI, por ejemplo
WS_BORDER es
0x00800000, es decir en binario eso es:
00000000100000000000000000000000 (¿a que ahora agradeces que antes haya usado sólo un byte?)
y
WS_CAPTION es
0x00C00000, en binario:
00000000110000000000000000000000
Si te fijas hay un bit compartido. Si tuviera puestos los dos estilos, si quito
WS_CAPTION también estaría quitando
WS_BORDER, o sea quiero tener un borde pero no título, ¡¡pero no hay manera!!, la selección de flags para los estilos me lo impide ¡gracias Microsoft!. Y si quiero quitar el borde porque quiero tener una ventana sin borde pero con título... ¡tampoco puedo!. Si quito su bit me quedaría:
00000000010000000000000000000000
Es decir
0x00400000 en hexadecimal, que corresponde a otro estilo (en este caso borde de tipo diálogo, que no es lo mismo que sin borde). Y en este caso igual nos sirve porque toca el borde y a lo mejor nos gusta, pero podría haber sido otro estilo diferente...
Poder quitar algunos flags o no depende del diseño que haya dado Microsoft a los mismos, hay que tener cuidado al quitar bits sueltos de la máscara de estilo.
El segundo problema, ya particular de tu caso, es que el estilo que estás intentando quitar no sirve para eso. Resulta que ese flag es para que la selección se muestre siempre, eso quiere decir que si lo pones se mostrará también aunque el control no tenga foco. Ese estilo
no hace nada mientras el control tiene foco, en ese caso la selección se mostrará da igual lo que valga
LVS_SHOWSELALWAYS. Así que quitarlo no quita la selección, sólo cuando no hay foco.
Las malas noticias es que no veo que haya estilos que impidan selección, para mí que no se puede, aunque esto sólo lo digo por lo que veo en la documentación,
si alguien sabe de algún estilo que falte ahí o si se puede hacer con otro comando (quizás mandando un mensaje al control) que lo diga.
De todas maneras dado lo que quieres hacer
tienes una solución. Con eso de cambiar el check al pinchar tendrás que hacer una gestión de eventos más compleja, supongo que capturando WM_COMMAND. Pues entonces lo que tienes que hacer es que al pinchar no sólo cambias el estilo del check, de paso aprovechas y vuelves a quitar la selección
En realidad parpadeará porque se pondrá y enseguida la quitarás, pero tampoco pasa nada porque como visualmente la celda cambia, pues estás cambiando el check, queda como un efecto visual.
Uf, estoy cansado de escribir, espero que la megaexplicación haya servido para algo.
(Bueno jamaro me alegro que lo hayas aprovechado, si has llegado hasta aquí igual ya no piensas lo mismo
)